2

我想在我的项目中实现 Symfony2 ACL。然而,基本权限(查看、编辑...)对我来说还不够。我至少需要两个额外的权限,即 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>

我尝试在 中覆盖它app/config/config.yml,但这不起作用(我收到一个错误,即权限配置密钥未知,或类似的东西)。

我也一直在查看服务,使用app/console container:debug,但我也找不到任何相关的服务来覆盖那里。

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

4

1 回答 1

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

那是为我做的。

于 2013-11-13T08:50:50.090 回答