Symfony 访问控制禁止具有正确角色的用户
Symfony access control forbids user with correct role
security.yml:
role_hierarchy:
admin: [test, simple]
providers:
database:
entity: { class: UserBundle:User, property: username }
firewalls:
dev:
pattern: ^/(_(profiler|wdt|error)|css|images|js)/
security: false
prod:
pattern: ^/
provider: database
anonymous: true
form_login:
login_path: public_login
check_path: public_login_check
default_target_path: dashboard
always_use_default_target_path: true
csrf_provider: form.csrf_provider
logout:
path: logout
target: public_login
access_control:
- { path: ^/(.+), roles: admin }
- { path: ^/$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
当我登录时,出现 403 forbidden 异常。然后我检查 profiler/security,角色看起来像这样:
Roles [ROLE_USER, admin]
当我将访问控制切换为:
- { path: ^/(.+), roles: ROLE_USER }
它工作正常。
为什么我的访问控制不允许我访问具有 "admin" 角色的页面,但允许我访问具有 "ROLE_USER" 的页面?
我的目标是放弃内置角色(如 ROLE_USER、ROLE_ADMIN 等),因为我正在为现有数据库编写应用程序,其中包含已经为用户定义的角色,所以我想使用它们。
您在安全配置中没有使用正确的角色语法
你应该改变
- { path: ^/(.+), roles: admin }
收件人:
- { path: ^/(.+), roles: ROLE_ADMIN }
我已经确认 'ROLE_' 前缀是必需的 - 这是因为 symfony 默认使用它自己的 RoleVoter implementation.
要去掉这个前缀,需要自定义 RoleVoter。为此,您需要创建自定义 class 实现 RoleVoterInterface,使其服务并使用 'security.voter' 标记,以强制安全层使用它而不是默认层。
Read more about implementing own RoleVoters on this example.
security.yml:
role_hierarchy:
admin: [test, simple]
providers:
database:
entity: { class: UserBundle:User, property: username }
firewalls:
dev:
pattern: ^/(_(profiler|wdt|error)|css|images|js)/
security: false
prod:
pattern: ^/
provider: database
anonymous: true
form_login:
login_path: public_login
check_path: public_login_check
default_target_path: dashboard
always_use_default_target_path: true
csrf_provider: form.csrf_provider
logout:
path: logout
target: public_login
access_control:
- { path: ^/(.+), roles: admin }
- { path: ^/$, roles: IS_AUTHENTICATED_ANONYMOUSLY }
当我登录时,出现 403 forbidden 异常。然后我检查 profiler/security,角色看起来像这样:
Roles [ROLE_USER, admin]
当我将访问控制切换为:
- { path: ^/(.+), roles: ROLE_USER }
它工作正常。
为什么我的访问控制不允许我访问具有 "admin" 角色的页面,但允许我访问具有 "ROLE_USER" 的页面?
我的目标是放弃内置角色(如 ROLE_USER、ROLE_ADMIN 等),因为我正在为现有数据库编写应用程序,其中包含已经为用户定义的角色,所以我想使用它们。
您在安全配置中没有使用正确的角色语法 你应该改变
- { path: ^/(.+), roles: admin }
收件人:
- { path: ^/(.+), roles: ROLE_ADMIN }
我已经确认 'ROLE_' 前缀是必需的 - 这是因为 symfony 默认使用它自己的 RoleVoter implementation.
要去掉这个前缀,需要自定义 RoleVoter。为此,您需要创建自定义 class 实现 RoleVoterInterface,使其服务并使用 'security.voter' 标记,以强制安全层使用它而不是默认层。
Read more about implementing own RoleVoters on this example.