Cakephp ACL: список всех документов, доступных пользователю - PullRequest
0 голосов
/ 01 января 2012

Я использую 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- > массив данных ...

1 Ответ

0 голосов
/ 02 января 2012

Вы можете создать метод 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 */);
    }

Извините, я не могу дать вам полный ответ, но я спешу, вымогу поработать над этим, и я вернусь к этому позже, чтобы посмотреть, как все прошло и, возможно, поможет вам больше.

...