5

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

site.com/login

site.com/admin/login

也可能是 site.com/ajax_login

我已经能够通过从 FOSUserBundle login.html.twig(被覆盖)中删除除 CSRF 令牌之外的所有内容,然后创建渲染自己的登录框和登录路由的路由来解决如何获取不同的模板来呈现(以便只呈现 CSRF 令牌)。这对管理员/登录不起作用,因为表单回发到登录,如果失败,它会显示该页面。

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

4

3 回答 3

2

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

我已经提交了拉取请求,它允许您更轻松地创建新的登录模板。在此处查看拉取请求: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 即可。

于 2013-06-30T10:31:24.177 回答
1

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

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

于 2012-05-27T08:15:48.407 回答
0

可以发一下你的模板吗?

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

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

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

于 2012-05-13T16:17:19.183 回答