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 安全不同的防火墙不能正确重定向到登录的主要内容,如果未能解决你的问题,请参考以下文章

如果我没有登录,Symfony 防火墙不会重定向我

ELB 后面的 Symfony2 重定向到 http 而不是 https

Symfony2 在未登录时将 /admin/* 重定向到 /admin/login(或使用 FOSUserBundle?)

Symfony 安全返回 401 响应而不是重定向

如何在 LoginListener 中的 onSecurityInteractiveLogin 方法中重定向 - Symfony2

Safari 是不是正确处理临时重定向 (307) 到不同的域?