具有多个角色的用户,访问始终被拒绝

时间:2013-02-25 15:44:10

标签: symfony fosuserbundle

用户可能有多个角色,例如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 }

哪个不起作用,但用户确实有这个角色?这有点令人厌倦。问题出在哪里?

2 个答案:

答案 0 :(得分:2)

对我来说这看起来像是一个错字。您在层次结构中定义了ROLE_SUBSCRIBTION_FOO(使用了B),但是您希望使用ROLE_SUBSCRIPTION_FOO(使用P)来限制路径。

答案 1 :(得分:0)

看看设置,一切似乎都正确。

我想从我的应用程序的管理区域动态更改用户角色。所以例如我将FOO角色赋予用户BOB并期望更改立即生效。

但这不起作用。用户BOB的当前打开会话未刷新。他必须重新认证自己。重新认证(再次注销并登录)后,symfonys安全系统会将角色与给定的访问列表进行正确比较。

所以我希望自动更新用户会话,但使用symfony的默认安全系统是不可能的。我认为需要扩展基于数据库的会话管理。这样您就可以刷新用户会话。