2012-01-01 2 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-> ...

ответ

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

Привет, Лучомолина, я играл на арку с объединениями и т. Д., Но пока не нашел подходящего ответа. Я думаю, что я собираюсь копаться в базовых классах ACL, чтобы увидеть, как cakephp справляется с этим. Основная проблема заключается в том, что таблицы ACL не содержат сопоставление идентификатора и идентификатора, поскольку документы «вложены». Суперпользователи и администраторы должны иметь доступ ко всем документам, не связывая отдельные документы с каждым из них. – Kriddy

Смежные вопросы