2016-12-29 104 views
3

定義角色我對角色的一些問題,我想明白了很久:在捆綁配置

我們有一些捆綁,我們在幾個項目中使用。我們希望在bundle配置中定義角色,這樣我們就不會將角色複製到security.yml中的role_hierarchy中。有沒有乾淨的方法來做到這一點?

我的第一個想法是將其導入role_hierarchy這樣的:

role_hierarchy: 
    ROLE_ADMIN:        ROLE_USER, ROLE_TRANSLATOR 
    ROLE_SUPER_ADMIN:      ROLE_ADMIN 
    ROLE_NOT_APPROVED_USER:     ROLE_USER 
    ROLE_TRANSLATOR:      ROLE_USER 
    "%base_bundle.role.hierarchy%" 

當然,這是行不通的。有沒有可能這樣做(在yaml中合併數組)?

我的另一個想法是將角色存儲在數據庫中,但在我看來這是過度殺毒,因爲我們沒有動態角色。一切都是靜態的。

是否有任何解決方法來實現我嘗試做的事情?或者將它定義在一個包中是一個好主意?

2.我用角色權限(ROLE_POST_EDITROLE_POST_DELETE ...)和選民拒絕或批准對資源的訪問。所以最後有很多角色。將角色與權限混合使用是一個好主意嗎?如果不是最佳做法是什麼?

編輯:我覺得ROLE_POST_EDITROLE_USERROLE_ADMIN之間的差異。用戶有ROLE_USER,因爲他是用戶。但用戶有「權限ROLE_EDIT_POST」才能編輯帖子。在我看來,有一個區別。無論如何,我應該關心這種差異還是有其他的做法如何做?

+0

你有沒有試過這樣: '''role_hierarchy: ROLE_SUPER_ADMIN:ROLE_ADMIN ROLE_NOT_APPROVED_USER:ROLE_USER ROLE_TRANSLATOR:ROLE_USER ROLE_ADMIN:[ROLE_USER,ROLE_TRANSLATOR]''' – rokas

+1

不知道這將幫助你,但結帳這:http://php-and-symfony.matthiasnoback.nl/2012/07/symfony2-security-creating-dynamic-roles-using-roleinterface/ –

+0

@rokas問題當然是,我我將數組參數'「%base_bundle.role.hierarchy%」'傳遞給角色層次結構。但問題不在於它。 @ B.Assem感謝您的鏈接。我已經看到了它,但可能沒有想太多。事實上,這可以是一條路。所以我可以編寫一個Role類並將bundle參數傳遞給它。 – user254319

回答

4
  1. 我們在幾個項目中使用了一些捆綁包。我們希望在bundle config中定義角色,這樣我們就不會將角色複製到security.yml中的role_hierarchy中。有沒有乾淨的方法來做到這一點?

可以使用另一部分的Prepended Extensions到 「前面加上」 配置:

class AcmeHelloExtension extends Extension implements PrependExtensionInterface 
{ 
    // ... 

    public function prepend(ContainerBuilder $container) 
    { 
     $container->prependExtensionConfig('security', [ 
      'role_hierarchy' => [ 
       'ROLE_ADMIN' => ... 
       ... 
      ], 
     ]); 
    } 
} 
  • 我用角色的權限(ROLE_POST_EDIT,ROLE_POST_DELETE。 ..)和選民拒絕或批准訪問資源。所以最後有很多角色。將角色與權限混合使用是一個好主意嗎?如果不是最佳做法是什麼?
  • 小misconfusion在這裏:你role_hierarchy定義的角色與您傳遞給isGranted()的事情。您將屬性傳遞給isGranted()。不幸的是,對於RoleHierarchyVoter,symfony決定將屬性similair設置爲角色名稱(也就是說,如果角色名稱以ROLE_開頭)。

    選民在權限或屬性被調用時進行投票。因此,在isGranted()中擁有許多權限是非常有效的。

    但是,我建議不要使用ROLE_*來啓動它們。這些屬性由RoleVoter/RoleHierarchyVoter檢查。將它們命名爲POST_EDITPOST_DELETE

    if ($this->isGranted('POST_EDIT', $post)) { 
        // ... 
    } 
    
    +0

    感謝您的回答。我不知道prependesExtensions。它適合我的使用情況。 我可能沒有解釋得很好。我有ROLE_POST_EDIT角色。只有擁有此角色的用戶(甚至是其他角色)才能編輯帖子。然後我有屬性(「編輯」,「顯示」),我「傳遞給選民」isGranted('編輯',$後)。 但ROLE_POST_EDIT看起來更像是對我的許可(而不是選民的術語)。管理員有ROLE_ADMIN,因爲他是管理員。用戶擁有ROLE_USER,因爲他是用戶。但是用戶可以有一個「權限ROLE_POST_EDIT」來編輯帖子。我應該關心它嗎? – user254319

    +0

    @ user254319啊,沒有。查看https://symfony.com/doc/current/security/voters.html。您將創建決定是否允許編輯帖子的選民。這個選民將檢查例如它是該管理員或該帖子的原始擁有者。我總是建議每個用戶有一個角色:用戶在網站上的角色。 –

    +0

    對於一個用戶來說,一個角色對我來說很合理,但在我的情況下它太靜態了。如果用戶有適當的許可,我們可以說約200個用戶可以去的地方。並且應該可以每次更改用戶或組權限。那麼怎麼做呢?在我們的例子中,很多選民看起來像是($ user-> hasRole('ROLE_LIST_POSTS'&& $ attribute ==='list')return ... GRANTED;只有少數我們檢查用戶是否以某種方式連接資源(例如所有者),所以acl似乎過於複雜了這個用例 – user254319