基本上我想要完成的是创建一个基于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.
答案 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:
.....