2012-01-01 60 views
0

我现在使用cakephp一段时间,刚刚开始使用ACL。除了一件事外,我已经掌握了它的运行。我如何查找当前用户可用的所有文档?cakephp ACL:列出用户可访问的所有文档

我有几个组(超级用户,管理员和普通用户)在Aros表中设置。我有几个文档应该可供所有超级用户和管理员访问,但只有特定用户才能访问。我想出了最接近的事是:

$this->data=$this->Document->find('all',array('fields'=>array('Document.id','Document.filename','Document.title'))); 
foreach($this->data as $i=>$document){ 
    if($this->Acl->check(array('model'=>'User','foreign_key'=>$this->Session->read('User.id')),array('model'=>'Document','foreign_key'=>$document['Document']['id']))!=1){ 
     unset($this->data[$i]); 
    } 
} 

与上面的“解决方案”的问题是,它首先查询的所有文档(这将成为数千名在不久的将来),然后带来了它归结为一个潜在的通过从$ this-> data数组中删除所有无法访问的文档来删除几个文档...

回答

0

您可以在用户模型上直接查询数据库的方法创建一个findAccessibleDocuments方法。你必须找出ACL表的结构以提出查询。

class User extends AppModel { 
    ... 
    public function findAccessibleDocuments($userId = null){ 
     if (!$userId) $userId = $this->getID; 
     return $this->query(/* select acos inner joining aros_acos and aros in which $userId is in. Optionally, you can inner join with Document to get more than their ids */); 
    } 

对不起,我不能给你完整的答案,但我在赶我现在,你可以在它的工作,我会回到这个以后,看它如何去,也许帮助您更多。

+0

嗨luchomolina,我一直在玩连接等,但还没有找到合适的答案。我想我会深入挖掘底层的ACL类,看看cakephp如何处理这个问题。主要的挑战是ACL表不包含id到id的映射,因为这些文档是'嵌套的'。超级用户和管理员应该能够访问所有文档,而无需将单个文档链接到每个文档。 – Kriddy 2012-01-11 20:52:53