2013-04-02 65 views
2

我想在我的項目中實現Symfony2 ACL。然而,基本權限(VIEW,EDIT ...)對我來說並不足夠。我需要至少兩個額外的權限,即COPY和REVIEW。Symfony2使用額外權限擴展ACL

經過一番挖掘後,我發現我可能不得不覆蓋/擴展Symfony/Component/Security/Acl/Permission/BasicPermissionMap.phpSymfony/Component/Security/Acl/Permission/MaskBuilder.php

Symfony/Bundle/SecurityBundle/Resources/config/security_acl.xml我發現,是指容許圖線:

<parameter key="security.acl.permission.map.class">Symfony\Component\Security\Acl\Permission\BasicPermissionMap</parameter> 

我試着在app/config/config.yml覆蓋這一點,但沒有工作(我得到一個錯誤的權限配置的關鍵是未知的,或類似的東西)。

我一直在尋找的服務,以及使用app/console container:debug,但我找不到任何相關服務覆蓋那裏。

難道有人指出我正確的方向嗎?

+0

我認爲COPY和REVIEW權限是更好的角色。我想要考慮哪些操作沒有被標準ACL涵蓋,但是不能看到。 COPY〜=查看。作爲一個角色,任何可以查看對象的用戶都可以創建它的新副本。審查也許是查看和刪除的組成? –

+0

你是如何覆蓋參數的?什麼是確切的錯誤? –

+0

我已經設法找到了解決辦法,並且很快就會發布答案。 COPY和REVIEW不可能作爲對象所有者可以說的「這個項目可以被這個用戶複製,這個項目可以被審查,這個項目可以被查看,並且這個項目可以被修改」。 – Bram

回答

6

這裏是我如何解決它(我提交了PR後,這已成爲Symfony的2.3更容易):

擴展現有MaskBuilder用自己的面具:

namespace Acme\DemoBundle\Security\Acl\Permission; 

use Symfony\Component\Security\Acl\Permission\MaskBuilder as BaseMaskBuilder; 

class MaskBuilder extends BaseMaskBuilder 
{ 
    const MASK_COPY   = 256;  // 1 << 8 
    const MASK_REVIEW  = 512;  // 1 << 9 

    const CODE_COPY   = 'X'; 
    const CODE_REVIEW  = 'R'; 
} 

擴展現有PermissionMap(你過去必須完全覆蓋它,因爲一切都設置爲私人)。

namespace Acme\DemoBundle\Security\Acl\Permission; 

use Symfony\Component\Security\Acl\Permission\BasicPermissionMap; 

class PermissionMap extends BasicPermissionMap 
{ 
    const PERMISSION_COPY  = 'COPY'; 
    const PERMISSION_REVIEW  = 'REVIEW'; 

    public function __construct() 
    { 
     parent::__construct(); 

     // This basically says "If you have VIEW, REVIEW, EDIT..., OWNER, 
     // you have VIEW". 
     $this->map[self::PERMISSION_VIEW] = array(
      MaskBuilder::MASK_VIEW, 
      MaskBuilder::MASK_REVIEW, 
      MaskBuilder::MASK_EDIT, 
      MaskBuilder::MASK_COPY, 
      MaskBuilder::MASK_OPERATOR, 
      MaskBuilder::MASK_MASTER, 
      MaskBuilder::MASK_OWNER, 
     ); 
     $this->map[self::PERMISSION_COPY] = array(
      MaskBuilder::MASK_COPY, 
      MaskBuilder::MASK_OPERATOR, 
      MaskBuilder::MASK_MASTER, 
      MaskBuilder::MASK_OWNER, 
     ); 
     $this->map[self::PERMISSION_REVIEW] = array(
      MaskBuilder::MASK_REVIEW, 
      MaskBuilder::MASK_OPERATOR, 
      MaskBuilder::MASK_MASTER, 
      MaskBuilder::MASK_OWNER, 
     ); 
    } 
} 

不要問我爲什麼你必須包括相同的權限。

最後,你需要告訴Symfony的使用您的PermissionMap在config.yml

parameters: 
    security.acl.permission.map.class: Acme\DemoBundle\Security\Acl\Permission\PermissionMap 

這爲我做。