我为Symfony 2.3.x安装了FOSUserBundle,因为我想创建一个用户需要登录的“安全”区域。
我设置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/*
的所有请求重定向到登录页面,即使路由不匹配也是如此。
在当前设置中,匹配的路由被重定向到登录页面。如果路线不匹配,则会显示错误页面。
有人能指出我如何实现上述功能吗?
答案 0 :(得分:2)
此配置应该适合您:
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
答案 1 :(得分:0)
由于没有真正简单的symfony安全解决方案(AFAIK),我已完成以下操作以获得所需的功能。
第1步:贪婪路线 在services.yml中,我添加了一个贪婪的路径到文件的底部(所以最后读取)。这条贪婪的路线模仿了路线的存在(即使它实际上并不存在)。此路由确保来自/ admin的所有请求(/ admin / login,/ admin / login_check和/ admin / logout除外)都被重定向到自定义重定向控制器。
此路由位于routing.yml文件的底部,因此如果存在与现有路由匹配的路由,则不会将其重定向到RedirectController,而是重定向到特定于该路由的控制器。
admin:
pattern: /admin/{var}
requirements:
var: "^(?!(login|login_check|logout)$).*"
defaults: { _controller: UserBundle:Redirect:index }
第2步 确保登录所需的路由可用于security.yml中的IS_AUTHENTICATED_ANONYMOUSLY(白名单)。
access_control:
- { path: ^/admin/login$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/logout$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: "^/admin", roles: ROLE_USER }
第3步 由于不存在的路由始终与步骤1中的贪婪模式匹配,因此我可以在用户登录时将所有内容重定向到自定义404页面。这就是我在RedirectController中所做的事情。
这种方法适合我,但它不是最优雅的方式。假设我在贪婪路线之后放置路线,它们永远不会匹配。这对可测试性不利。
如果有人有更好的想法,请分享:)
到目前为止,特别感谢enigma,我从你评论中的想法中找到了这个解决方案。