[英]Symfony2 extend ACL with additional Permissions
我想在我的項目中實現Symfony2 ACL。 但是,基本權限(VIEW,EDIT ...)對我來說還不夠。 我至少需要兩個附加權限,即COPY和REVIEW。
經過一番挖掘之后,我發現我很可能將不得不覆蓋/擴展Symfony/Component/Security/Acl/Permission/BasicPermissionMap.php
和Symfony/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
來查看這些服務,但是我也找不到任何相關的服務來覆蓋那里。
有人可以指出我正確的方向嗎?
解決方法如下(提交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(由於所有內容都設置為private,因此您不得不完全覆蓋它)。
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在config.yml
使用您的PermissionMap:
parameters:
security.acl.permission.map.class: Acme\DemoBundle\Security\Acl\Permission\PermissionMap
對我來說就做到了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.