实际上使用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
答案 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
}
}