我需要拒绝具有角色 ROLE_UNFILLED_USER 的用户访问除一个页面之外的所有页面。如何使用 security.yml 中的 access_control 执行此操作
问问题
2600 次
3 回答
1
第一步是定义角色层次结构,其中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
extends ROLE_UNFILLED_USER
,具有该角色的用户可以访问所有页面(包括工作表)。
但是,您的方法有一个警告,当用户登录时,他们会自动重定向到指定的 target_path 或先前请求的路径。这意味着,如果您的用户登录,他们很可能会看到一个 403 页,并且会对他们为什么无权访问感到困惑。解决方案:创建一个自定义的AuthenticationProvider(特别看一下Listener)。
于 2012-12-05T13:00:14.840 回答
0
如果用户具有特定角色,您需要使用登录侦听器并重定向用户。或者也许只是使用请求侦听器。
于 2015-11-17T12:52:23.197 回答
0
你需要这样的东西:
access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, roles: ROLE_ADMIN }
在您的 security.yaml 文件的安全部分。此设置允许您保护站点的所有页面,除了一个(登录表单匹配“/login”)
于 2018-04-18T13:22:04.293 回答