2012-01-01 1 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, 나는 조인 등으로 arround를 해왔지만 아직 적절한 대답을 아직 찾지 못했습니다. 나는 기본적인 ACL 클래스를 파헤쳐서 cakephp가 이것을 어떻게 처리 하는지를 살펴볼 것이라고 생각한다. 가장 큰 문제는 문서가 '중첩'되어 있기 때문에 ACL 테이블에 ID 대 ID 매핑이 포함되어 있지 않다는 것입니다. 수퍼 유저와 관리자는 개별 문서를 각 문서에 연결하지 않고 모든 문서에 접근 할 수 있어야합니다. – Kriddy