我需要拒绝访问除了角色为ROLE_UNFILLED_USER的用户以外的所有页面。如何使用security.yml
中的access_control执行此操作答案 0 :(得分:0)
第一步是定义角色层次结构,其中ROLE_USER
继承自ROLE_UNFILLED_USER
:
# app/config/security.yml
role_hierarchy:
ROLE_USER: ROLE_UNFILLED_USER # <-- This is the crucial part
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_API_USER, ROLE_ADMIN]
现在您可以放置访问控制:
access_control:
- { path: "^/user/worksheet", roles: ROLE_UNFILLED_USER }
- { path: "^/bill", roles: ROLE_USER }
- { path: "^/address_book", roles: ROLE_USER }
- { path: "^/friendinvite", roles: ROLE_USER }
- { path: "^/admin", roles: ROLE_ADMIN }
#- { path: "^/", roles: IS_AUTHENTICATED_ANONYMOUSLY }
每当角色为ROLE_UNFILLED_USER
的用户尝试访问^/user/worksheet
以外的路由时,他们都会看到403(禁止访问)。如果添加其他路线,请确保正确订购; Symfony将使用它找到的第一个匹配路由,这意味着列表顶部应该有更具体的路由,底部的通用路由越多!
由于ROLE_USER
扩展ROLE_UNFILLED_USER
,具有该角色的用户可以访问所有页面(包括工作表)。
但是,您的方法有一个警告,当用户登录时,它们会自动重定向到指定的target_path或先前请求的路径。这意味着,如果您的用户登录,他们很可能会看到403页,并且会对他们无权访问的原因感到困惑。解决方案:创建自定义AuthenticationProvider(特别是查看Listener)。
答案 1 :(得分:0)
如果用户具有某个角色,您需要使用Login Listener并重定向用户。或者只是使用请求监听器。
答案 2 :(得分:0)
你需要这样的东西:
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, roles: ROLE_ADMIN }
在安全部分中的security.yaml文件。此设置允许您保护您网站的所有页面,除了一个(登录表单匹配&#34; /登录&#34;)