0

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

整个想法是根据当前登录的用户及其权限直接过滤 DQL 查询。

我在 Symfony 2 http://symfony.com/doc/current/cookbook/security/acl_advanced.html中找到了这种机制的实现,在这种情况下,如果每个用户可以访问单行,则似乎为每个用户存储一个表,所以我们可以很容易地通过加入这个表来动态加载只允许的行。

为了综合,我正在寻找一种方法来根据条件定义对实体的访问规则,但希望能够在单个查询中获得结果,以便能够进行一些排序和分页。

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

似乎无法将 SF2 安全组件集成为独立的:Symfony 2.0 的安全组件作为独立的

4

1 回答 1

0

您必须使用学说过滤器为当前成员加载内容

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

$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
    }
}
于 2013-04-02T21:53:18.390 回答