2012-01-01 9 views
0

私はしばらくの間、cakephpを使用しています。 1つのことを除いて、私はそれを稼働させている。現在のユーザーが利用できるすべてのドキュメントを検索するにはどうすればよいですか?cakephp ACL:ユーザがアクセス可能なすべてのドキュメントを一覧表示します。

私はArosテーブルにいくつかのグループ(スーパーユーザー、管理者、一般ユーザー)を設定しています。スーパーユーザーと管理者はすべてアクセスできるはずの複数のドキュメントがありますが、一般ユーザーには特定のドキュメントのみがアクセスできます。上記の「解決策」の問題は、それが最初に(近い将来、数千になります)すべての文書を照会して、潜在的にAにそれをダウンさせていることである

$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、私は結合などでarroundを演奏していますが、まだ適切な答えはまだ見つかりませんでした。私は、基本的なACLクラスを掘り下げてcakephpがこれをどのように処理するのかを見ていきたいと思います。主な課題は、ACLテーブルがIDからIDへのマッピングを含んでいないことです。文書は「入れ子になっている」ためです。スーパーユーザと管理者は、個々のドキュメントをそれぞれにリンクさせずにすべてのドキュメントにアクセスできる必要があります。 – Kriddy

関連する問題