zf2 acl doctrine 2

时间:2013-04-01 11:14:40

标签: doctrine-orm zend-framework2 acl

实际上使用Zend Framework 2,我正在寻找一种基于数据库实现高性能ACL策略的方法。

整个想法是直接过滤DQL查询,具体取决于当前登录的用户及其权限。

我在Symfony 2 http://symfony.com/doc/current/cookbook/security/acl_advanced.html中找到了这个mecanisme的实现,在这种情况下,如果每个用户可以访问一行,则表中似乎存储了一个表,因此我们可以通过加入轻松地动态加载所允许的行这张桌子。

要综合,我正在寻找一种基于标准定义实体访问规则的方法,但希望能够在单个查询中获得结果,以便能够进行一些排序和分页。

是否有任何ZF2模块可以解决这种情况?

看起来将SF2安全组件作为独立集成不是一个选项:Security component from Symfony 2.0 as standalone

1 个答案:

答案 0 :(得分:0)

您必须使用doctrine过滤器来加载当前成员的内容

我的代码添加成员查询过滤器的示例:

$em = $sm->get('doctrine.entitymanager.orm_default');


$ormconfig = $sm->get('doctrine.configuration.orm_default');


$ormconfig->addFilter("member", "\PatrickCore\Script\ORM\Functional\MemberAccessFilter");


//

$currentUser = $membersService->getCurrentUser();

$uid = $currentUser->getId();
$filter = $em->getFilters()->enable("member");
$filter->setParameter('member', $uid);

此文件 \ PatrickCore \ Script \ ORM \ Functional \ MemberAccessFilter

<?php
namespace PatrickCore\Script\ORM\Functional;
use Doctrine\ORM\Mapping\ClassMetaData,
    Doctrine\ORM\Query\Filter\SQLFilter;

class MemberAccessFilter extends SQLFilter
{
    public function addFilterConstraint(ClassMetadata $targetEntity, $targetTableAlias)
    {
        // Check if the entity implements the LocalAware interface

        if (!$targetEntity->reflClass->implementsInterface('\PatrickCore\Entity\MemberAccessAware')) {
            return "";
        }

        return $targetTableAlias.'.member_id = ' . $this->getParameter('member'); // getParameter applies quoting automatically
    }
}