我正在使用FOSUserBundle,我需要能够从2个不同的路由(或更多)登录。这些路由将有不同的模板,也可以登录到不同的区域。登录之间唯一不同的是所需的权限。路线将沿着的路线
site.com/login
site.com/admin/login
以及可能的站点.com/ajax_login
我已经能够通过从FOSUserBundle login.html.twitch(即overriden)中剥离除CSRF令牌之外的所有内容,然后创建呈现自己的登录框和登录路由的路由(这样就只呈现CSRF令牌),来获得不同的模板。这对admin/login不起作用,因为表单会返回到login,如果失败,它会显示该页面。
有什么简单的方法可以做到这一点吗?
我被同样的问题困扰了一段时间,然后我自己创建了一个解决方案。我知道一定有一个简单的解决方案。。。
我已经提交了pull请求,它允许您更容易地创建新的登录模板。请在此处查看拉取请求:https://github.com/FriendsOfSymfony/FOSUserBundle/pull/1186.
还有另一种非常简单的方法可以实现这一点。扩展SecurityController并使用以下内容更改renderLogin方法
protected function renderLogin(array $data, $template)
{
return $this->container->get('templating')->renderResponse('YourBundle:Security:login.html.twig');
}
然后创建一条到新创建的控制器的路线:
admin.login:
pattern: /admin/login
defaults: { _controller: YourBundle:Security:login }
在此之后,您只需要相应地更改您的安全配置。将你的form_login login_path更改为/admin/login,你就可以开始了。
这是我最终想到的,基本上两者使用相同的防火墙并共享相同的上下文,所以当我通过正常登录登录时,他们也可以访问管理员(假设他们是管理员)
firewalls:
admin:
context: site
switch_user: true
pattern: /admin(.*)
form_login:
provider: fos_userbundle
login_path: /admin/login
success_handler: admin_authentication_handler
use_forward: false
check_path: /admin/login_check
failure_path: null
use_referer: true
always_use_default_target_path: true
default_target_path: /admin/
logout:
path: /admin/logout
target: /admin/login
anonymous: true
public:
pattern: ^/
context: site
form_login:
login_path: /login
success_handler: authentication_handler
failure_handler: authentication_handler
provider: fos_userbundle
anonymous: true
logout: true
当然,如果您需要制作AJAX登录框,则需要覆盖成功和失败处理程序,并检查请求是否为XmlHttpRequest并返回登录结果。
你能发布你的模板吗?
你在模板中正确编辑了路径吗?
<form action="{{ path('form_submit') }}" method="post" {{ form_enctype(form) }}>
您希望将表单发送到正确的控制器。