Symfony 2.3/FOSUserBundle:即使路由不匹配,也重定向到登录页面
我为Symfony 2.3.x安装了FOSUserBundle,因为我想创建一个用户需要登录的“安全”区域 I设置Symfony 2.3/FOSUserBundle:即使路由不匹配,也重定向到登录页面,symfony,routing,fosuserbundle,Symfony,Routing,Fosuserbundle,我为Symfony 2.3.x安装了FOSUserBundle,因为我想创建一个用户需要登录的“安全”区域 I设置security.yml如下所示: security: encoders: FOS\UserBundle\Model\UserInterface: sha512 role_hierarchy: ROLE_ADMIN: ROLE_USER ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_
security.yml
如下所示:
security:
encoders:
FOS\UserBundle\Model\UserInterface: sha512
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
providers:
fos_userbundle:
id: fos_user.user_provider.username
firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
logout: true
anonymous: true
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, role: ROLE_ADMIN }
这个很好用。如果用户未登录,我希望将所有对/admin/*
的请求重定向到登录页面,即使路径不匹配
在当前设置中,匹配的路由将重定向到登录页面。当路由不匹配时,将显示错误页面
有人能告诉我如何实现上述功能的正确方向吗?此配置应该适合您:
firewalls:
admin:
pattern: /admin(.*)
context: user
form_login:
provider: fos_userbundle
login_path: /admin/login
use_forward: false
check_path: /admin/login_check
failure_path: null
由于没有真正简单的symfony安全解决方案(AFAIK),我做了以下工作来获得想要的功能 步骤1:贪婪路线 在services.yml中,我在文件的底部添加了一个贪婪的路由(因此它最后被读取)。这种贪婪的路由模仿路由的存在(即使它实际上并不存在)。此路由确保来自/admin的所有请求(除了/admin/login、/admin/login\u check和/admin/logout)都重定向到自定义重定向控制器 此路由位于routing.yml文件的底部,因此如果存在与现有路由匹配的路由,它将不会重定向到RedirectController,而是重定向到特定于该路由的控制器
admin:
pattern: /admin/{var}
requirements:
var: "^(?!(login|login_check|logout)$).*"
defaults: { _controller: UserBundle:Redirect:index }
步骤2
确保登录所需的路由可用于security.yml中的匿名身份验证(白名单)
access_control:
- { path: ^/admin/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/logout$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: "^/admin", roles: ROLE_USER }
步骤3
由于不存在的路由总是与步骤1中的贪婪模式相匹配,因此当用户登录时,我可以将所有内容重定向到自定义404页面。这就是我在重定向控制器中所做的
这种方法对我很有效,但它不是最优雅的方法。假设我将路由放在贪婪路由之后,它们将永远不会匹配。这不利于可测试性
如果有人有更好的想法,请分享:)
到目前为止,特别感谢enigma,我是根据您评论中的想法得出此解决方案的。感谢您对enigma的回复!这似乎让我更接近我想要的东西,但在这种配置中,我遇到了两个问题。1.从/admin/test到登录表单的所有内容都会被重定向到登录表单,但是如果还有一个url部分(例如/admin/test/test2),那么它就不会再重定向到登录表单,并给出一个route not found异常。2.当我被重定向到/admin/login时,我陷入了一个循环,我还不知道为什么。我已经解决了重定向循环的问题。我发现我没有正确地覆盖标准FOSUserBundle登录路由。我正在路由到/admin/login,但登录名位于/login。但是仍然存在的一个问题(我仍然无法解决)是为什么/admin/test的路由正确地重定向到登录表单,而/admin/test/other_test没有。目前我也看不到一个简单的解决方案。我猜这和模式匹配和防火墙无关,而是和路由有关。您可以制作自己的重定向控制器,可以在routing.yml文件中配置该控制器,以便在前缀
/admin
上调用,就像Symfony FrameworkBundle重定向控制器一样。上述控制器可用于继承当前行为。