用户可能有多个角色,例如ROLE_USER, ROLE_SUBSCRIBTION_FOO, ROLE_SUBSCRIBTION_BAR
。
根据他们的角色,我定义了一个访问控制列表:
- { path: ^/admin/helpdesk/foo, roles: ROLE_SUBSCRIPTION_FOO }
- { path: ^/admin/helpdesk/index, roles: ROLE_ADMIN }
角色层次结构
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUBSCRIBTION_FOO: ROLE_ADMIN
ROLE_SUPER_ADMIN: ROLE_ADMIN
现在的问题是,当用户具有角色ROLE_SUBSCRIBTION_FOO
并且访问/admin/helpdesk/foo
访问被拒绝时。用户同时具有ROLE_ADMIN和ROLE_SUBSCRIBTION_FOO。但是,当我有
- { path: ^/admin/helpdesk/foo, roles: ROLE_ADMIN }
它有效,但我需要它
- { path: ^/admin/helpdesk/foo, roles: ROLE_SUBSCRIPTION_FOO }
哪个不起作用,但用户确实有这个角色?这有点令人厌倦。问题出在哪里?
答案 0 :(得分:2)
对我来说这看起来像是一个错字。您在层次结构中定义了ROLE_SUBSCRIBTION_FOO
(使用了B),但是您希望使用ROLE_SUBSCRIPTION_FOO
(使用P)来限制路径。
答案 1 :(得分:0)
看看设置,一切似乎都正确。
我想从我的应用程序的管理区域动态更改用户角色。所以例如我将FOO角色赋予用户BOB并期望更改立即生效。
但这不起作用。用户BOB的当前打开会话未刷新。他必须重新认证自己。重新认证(再次注销并登录)后,symfonys安全系统会将角色与给定的访问列表进行正确比较。
所以我希望自动更新用户会话,但使用symfony的默认安全系统是不可能的。我认为需要扩展基于数据库的会话管理。这样您就可以刷新用户会话。