Symfony2 安全不同的防火墙不能正确重定向到登录
Posted
技术标签:
【中文标题】Symfony2 安全不同的防火墙不能正确重定向到登录【英文标题】:Symfony2 security different firewalls don't redirect properly to login 【发布时间】:2015-12-17 19:02:05 【问题描述】:我根据用户类型配置了 3 个安全区域:管理员、教师和学生。当我访问 /admin 时,我被正确重定向到 /admin/login。但是当我访问 /teacher 或 /student 时,重定向失败,尽管我被重定向到 /teacher/login 或 /student/login 我收到此错误:
页面未正确重定向 Firefox 检测到服务器正在以永远不会完成的方式重定向对该地址的请求。
这是我的 security.yml:
防火墙: # 禁用资产和分析器的身份验证,根据您的需要进行调整 开发: 模式:^/(_(profiler|wdt)|css|images|js)/ 安全性:假 行政: 模式:^/管理员 表单登录: check_path: login_check 登录路径:/admin/login 提供者:chain_provider csrf_provider:form.csrf_provider default_target_path:/管理员 注销:真 老师: 模式:^/老师 表单登录: check_path: login_check 登录路径:/老师/登录 提供者:chain_provider csrf_provider:form.csrf_provider default_target_path: /老师 注销:真 学生: 模式:^/学生 表单登录: check_path: login_check 登录路径:/学生/登录 提供者:chain_provider csrf_provider:form.csrf_provider default_target_path:/学生 注销:真 访问控制: - 路径:^/admin/login,角色:IS_AUTHENTICATED_ANONYMOUSLY - 路径:^/teacher/login,角色:IS_AUTHENTICATED_ANONYMOUSLY - 路径:^/teacher/register,角色:IS_AUTHENTICATED_ANONYMOUSLY - 路径:^/student/login,角色:IS_AUTHENTICATED_ANONYMOUSLY - 路径:^/学生/注册,角色:IS_AUTHENTICATED_ANONYMOUSLY - 路径:^/resetting,角色:IS_AUTHENTICATED_ANONYMOUSLY - 路径:^/admin,角色:ROLE_ADMIN - 路径:^/teacher,角色:ROLE_TEACHER - 路径:^/学生,角色:ROLE_USER我需要一些帮助。我错过了什么?谢谢
【问题讨论】:
【参考方案1】:您已经保护了您的登录表单...所以当 Symfony 尝试重定向到您的登录表单时,它会尝试重定向到您的登录表单,尝试重定向到您的登录表单,尝试重定向...
试试这个:
admin_login:
pattern: ^/admin/login
anonymous: ~
admin:
pattern: ^/admin
form_login:
login_path: /admin/login
check_path: /login_check
provider: chain_provider
csrf_provider: form.csrf_provider
default_target_path: /admin
logout:
path: /logout
target: /admin/login
teacher_login:
pattern: ^/teacher/login
anonymous: ~
teacher:
pattern: ^/teacher
form_login:
... etc ...
student_login:
pattern: ^/student/login
anonymous: ~
student:
pattern: ^/student
form_login:
.... etc ...
access_control:
- path: ^/admin/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY
- path: ^/teacher/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY
- path: ^/student/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY
...
- path: ^/admin, roles: ROLE_ADMIN
- path: ^/teacher, roles: ROLE_TEACHER
- path: ^/student, roles: ROLE_USER
这在 Symfony Cookbook 中的 Avoid Common Pitfalls 标题下进行了介绍。
防火墙的顺序很重要
请注意,“登录防火墙”是在其合作伙伴防火墙之前定义的。
还请注意,我在您的 check_path 前面添加了一个“/”,以提醒您需要为它定义一个路由。如果你使用注解来定义你的路由,你需要在某个地方的控制器中创建一个空的操作方法,以便路由器有一些东西可以咀嚼。
您的“注销”定义在我看来也很可疑。并不是说它们完全不正确——只是我以前从未见过它们是这样定义的,而且鉴于我对 Symfony 的了解,我不确定你的定义将如何工作。
对于我在上面示例中定义的“/logout”路径,您将 - 再次 - 需要为这些路径创建一个有效的路由......即使 Symfony 实际上不会执行任何“注销”您在控制器中定义的方法。
注销的东西被覆盖了HERE
【讨论】:
感谢您的链接。我在每个防火墙下方添加了anonymous: ~
,现在我已正确重定向。但是在输入用户名/密码后,我收到了这条消息。 您必须在安全防火墙配置中使用 form_login 配置防火墙处理的检查路径。
只是为了确保......你不能只在每个防火墙下添加匿名 - 你需要在自己的防火墙下设置每个登录路径 - 并且顺序很重要。 admin_login: 需要在 admin: 之前出现,等等...您还需要确保为 login_check 路径配置路由。如果您使用注解来定义路由,这意味着您需要在控制器中创建一个空的操作方法,以便路由器有一些东西可以咀嚼。我将快速编辑我的答案...以上是关于Symfony2 安全不同的防火墙不能正确重定向到登录的主要内容,如果未能解决你的问题,请参考以下文章
ELB 后面的 Symfony2 重定向到 http 而不是 https
Symfony2 在未登录时将 /admin/* 重定向到 /admin/login(或使用 FOSUserBundle?)
如何在 LoginListener 中的 onSecurityInteractiveLogin 方法中重定向 - Symfony2