sonata用户新防火墙保持重定向到错误的路由

时间:2014-12-11 13:24:39

标签: symfony symfony-sonata sonata-user-bundle

基本上我想要完成的是创建一个基于sonata用户的新登录表单,这是一个用于奏鸣曲电子商务的fos用户实现。新的登录表单应该与原始登录表单相同,但具有不同的布局。

我做了什么:
- 创建了新的twig文件
- 添加路由:

m2m_partner:
resource: "@ApplicationSonataUserBundle/Resources/config/routing/partnerlogin.xml"
prefix: /partner

内容:

<route id="m2m_partner_login" pattern="/login">
<default key="_controller">ApplicationSonataUserBundle:Partner:login</default>
</route>

- 在security.yml中添加了新的防火墙(非常类似于'admin'中的防火墙)

    partner:
        pattern:      /partner(.*)
        context:        user
        form_login:
            provider:       fos_userbundle
            login_path:     /partner/login
            use_forward:    false
            check_path:     /partner/login_check
            failure_path:   null
        logout:
            path: /partner/logout
            invalidate_session: false
            handlers: ['sonata.page.cms_manager_selector']
        anonymous:    true
        switch_user: true

之后,当我填写好的凭据时,它会将我记录在案,但是当我输入错误的凭据时,它会将我重定向到/ login而不是/ partner / login,并显示“bad credentials”消息。我该如何解决?我错过了什么吗?

编辑1:
我检查了管理员登录是如何进行的,并发现表单操作转到与正常登录不同的控制器,这看起来与fos用户'检查'操作相同:

    public function checkAction()
{
    throw new \RuntimeException('You must configure the check path to be handled by the firewall using form_login in your security firewall configuration.');
}

我将它复制到我的控制器,然后在提交带有错误凭据的表单后我得到的是这个错误:

 You must configure the check path to be handled by the firewall using form_login in your security firewall configuration. 

2 个答案:

答案 0 :(得分:1)

您应该将failure_path更改为新路由:

  form_login:
        failure_path:   /partner/login

或者

  form_login:
        failure_path:   m2m_partner_login

第二种方式更清晰,因为它使用路由名而不是网址。因此,如果你更改xml中的url,它就不会破坏你的防火墙。

http://symfony.com/doc/current/cookbook/security/form_login.html#redirecting-on-login-failure

我猜你是否提供了fail_path,它会回退到默认的失败路径(/ login)。

<强> EDIT1:

您需要添加路线xml:

<route id="m2m_partner_login_check" pattern="/login_check">
    <default key="_controller">ApplicationSonataUserBundle:Partner:check</default>
    <requirement key="_method">POST</requirement>
</route>

<route id="m2m_partner_logout" pattern="/logout">
    <default key="_controller">ApplicationSonataUserBundle:Partner:logout</default>
</route>

也许这会解决这个异常。

答案 1 :(得分:1)

检查您的firewals元素的顺序。 合作伙伴应该在主要部分之上,如

 firewalls:
      partner:
         pattern:      /partner(.*)
         ......



      main:
       .....