2013-02-25 80 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)限制路徑。