Symfony2使用额外的权限扩展ACL

Bra*_*ram 2 php symfony

我想在我的项目中实现Symfony2 ACL.但是,基本权限(VIEW,EDIT ...)对我来说还不够.我需要至少两个额外的权限,即COPY和REVIEW.

一些周围挖后,我发现,我将最有可能不得不重写/扩展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>
Run Code Online (Sandbox Code Playgroud)

我尝试覆盖这个app/config/config.yml,但是没有用(我得到一个错误,权限配置密钥是未知的,或类似的东西).

我一直在看服务,通过使用app/console container:debug,但我找不到任何相关服务覆盖那里.

有人能指出我正确的方向吗?

Bra*_*ram 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';
}
Run Code Online (Sandbox Code Playgroud)

扩展现有的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,
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

不要问我为什么你必须包含相同的权限.

最后,您需要告诉Symfony在以下位置使用PermissionMap config.yml:

parameters:
    security.acl.permission.map.class: Acme\DemoBundle\Security\Acl\Permission\PermissionMap
Run Code Online (Sandbox Code Playgroud)

这样做对我来说.