2013-04-01 119 views
0

實際上,使用Zend Framework 2,我正在尋找一種方法來實現基於數據庫的高性能ACL策略。zf2 acl doctrine 2

整個想法是根據當前登錄的用戶直接過濾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

你必須使用負載的東西教條過濾器當前成員的我的代碼加入會員查詢過濾

例子:

$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 \腳本\ ORM \功能\ 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 
    } 
} 
+0

感謝您的回答。我今天意識到我的問題更多的是找到存儲行級訪問的好方法,以便我可以通過內連接進行過濾 – user2231809