首页 文章

Symfony2 - FOSUserBundle - 多个登录位置

提问于
浏览
5

我正在使用FOSUserBundle,我需要能够从2个不同的路由(或更多)登录 . 这些路线将具有不同的模板,并且还会登录到不同的区域 . 登录之间唯一不同的是所需的权限 . 路线将是符合的路线

site.com/login

site.com/admin/login

还有可能是site.com/ajax_login

我已经能够通过从FOSUserBundle login.html.twig(被覆盖)中删除除CSRF令牌之外的所有内容,然后创建呈现自己的登录框和登录路径的路由,来研究如何获取不同的模板 . (这样只会渲染CSRF令牌) . 这不适用于admin / login,因为表单会回发登录,如果失败则会显示该页面 .

有没有简单的方法来实现这一目标?

3 回答

  • 0

    我被困了一段时间同样的问题,然后我自己创建了一个解决方案 . 我知道必须有一个简单的解决方案......

    我已经提交了pull request,它允许您更轻松地创建新的登录模板 . 在这里检查拉取请求: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,您就可以了 .

  • 2

    这是我最终提出的,基本上两者都使用相同的防火墙并共享相同的上下文,所以当我通过正常登录登录时,他们也可以访问管理员(假设他们是管理员)

    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并返回登录结果 .

  • 1

    你可以发布你的模板吗?

    您是否在模板中正确编辑了路径?

    <form action="{{ path('form_submit') }}" method="post" {{ form_enctype(form) }}>
    

    您想将表单发送到正确的控制器 .

相关问题