2013-02-25 55 views
1

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

不工作,howeve用户确实有作用?这是有点we。。任何想法的问题是?

+0

你确定你正在测试的用户有'ROLE_ADMIN'而不是'ROLE_SUPER_ADMIN'吗?因为用你的实际设置,具有'ROLE_SUPER_ADMIN'的用户不具有'ROLE_SUBSCRIBTION'。 – Mick 2013-02-25 16:01:29

+0

不,用户角色a:2:{i:0; s:10:“ROLE_ADMIN”; i:1; s:21:“ROLE_SUBSCRIBTION_FOO”;}是我正在测试的用户 – 2013-02-25 16:04:03

+0

好吧,看起来不错。你是否检查过用户是否在会话中也有这些角色?不只在数据库中? – Mick 2013-02-25 16:25:31

回答

0

看着设置一切似乎是正确的。

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

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

所以我期望用户会话自动更新,但这对于symfony的默认安全系统来说是不可能的。我认为它需要通过基于数据库的会话管理进行扩展。这样你可以刷新用户会话。

2

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