2012-01-01 27 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

相關問題