2016-10-11 17 views
1

我在security.yml配置文件中定義的角色層次:Symfony的roleHierarchy和控制器的安全註解

role hierarchy:   
    ROLE_USER: [ROLE_USER] 
    ROLE_OFFICE: [ROLE_OFFICE] 
    ROLE_TEST: [ROLE_OFFICE, ROLE_USER] 

我想使用安全註釋在我的控制器:

/** 
* @Route("/office", name="office") 
* @Security("has_role('ROLE_OFFICE')") 
*/ 

哪有我使用帶註釋的角色層次結構。以我的示例,具有ROLE_TEST的用戶將不被允許訪問我的辦公室路線。

謝謝。

回答

2

當您定義新角色時,您正在定義角色繼承哪個現有角色。你在這裏的定義是錯誤的。

  1. 您不必定義ROLE_USER,只要您擴展它就會被定義。 (感謝@Yonel)
  2. 正如我上面提到的,新的角色應該延長現有之一:

    role_hierarchy: 
        ROLE_OFFICE: ROLE_USER 
        ... 
    

    ROLE_OFFICE也將有ROLE_USER

  3. ROLE_TEST目前也已ROLE_OFFICE,這意味着允許ROLE_TEST訪問路由/辦公室。要解決此問題,您必須從您的定義中刪除ROLE_OFFICE


這應該是工作的定義:

role_hierarchy: 
    ROLE_OFFICE: ROLE_USER 
    ROLE_TEST: ROLE_USER 

文檔:http://symfony.com/doc/current/security.html#hierarchical-roles

+1

只要說'ROLE_USER'沒有定義由Symfony的本身,它在'role_hierarchy'的已定義(即'ROLE_OFFICE:ROLE_USER'定義了兩個角色同時) – yceruto

+1

@Yonel謝謝,我不知道!我已經更新了我的答案。 –

+0

謝謝你的精確度。現在我的安全註釋按預期工作。 – ArGh

0

如果你改變一點點你的註釋:

@Security("is_granted('ROLE_OFFICE')") 

ROLE_TEST是否訪問資源?

0

如果你想排除一個特定角色的路線,你可以否定這個條件。如例:

/** 
* @Route("/office", name="office") 
* @Security("not has_role('ROLE_TEST')") 
*/ 

希望這有助於