Symfony2-FOSUserBundle-多个登录位置


Symfony2 - FOSUserBundle - Multiple Login Locations

我正在使用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) }}>

您希望将表单发送到正确的控制器。