Symfony2扩展具有其他权限的ACL - php

我想在我的项目中实现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>

我试着在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

对我来说就做到了。

Symfony 2在用户站点上动态添加字段以形成表单 - php

我正在研究调查包。目的是为用户提供一个功能全面的调查系统。我已经准备好一个后端,使您可以创建调查,添加问题(打开文本,单选按钮,复选框),是否需要提问,激活调查,生成令牌以及通过电子邮件将令牌发送到调查的链接。当然,我也有显示调查并保存答案的前端。现在,我想添加另一种可能性。带有答案(单选或复选框)和评论的问题。例如:你有一只狗吗?是没有如果用户选择是,则附…

PHP-将日期插入日期时间字段 - php

我已在数据库中使用datetime字段存储日期,使用PHP将“今天的日期”插入该字段的正确方法是什么?干杯, 参考方案 我认为您可以使用php date()函数

php ziparchive类源代码 - php

Improve this question 我如何获取ziparchive类本身的源代码。 参考方案 假设您在谈论PHP ZipArchive class:下载PHP source code并查找适当的文件。如果您希望源代码是PHP代码,您可能会感到失望,因为源代码是用C语言编写的。或者,也可以在PHP Github Development Reposito…

PHP getallheaders替代 - php

我正在尝试从服务器上的apache切换到nginx。唯一的问题是我在PHP脚本中使用的getallheaders()函数,该函数不适用于Nginx。我已经尝试过用户在getallheaders函数上的php站点上提供的注释,但这并不返回所有请求标头。请告诉我如何解决这个问题。我真的想切换到Nginx。 参考方案 您仍然可以使用它,但是您必须像这里一样重新定义…

PHP-如何建议搜索字词,“你是说……?” - php

当使用不检索任何结果的术语搜索数据库时,我想允许“您是不是……”建议(例如Google)。例如,如果有人寻找“ jquyer””,它将输出“ did you mean jquery?”当然,建议结果必须与数据库内部的值匹配(我正在使用mysql)。您知道可以做到这一点的图书馆吗?我已经用谷歌搜索过,但是没有找到任何好的结果。或者,也许您有一个想法,该如何独自…