Расширенный CWebUser и переписывание Yii accessControl - PullRequest
2 голосов
/ 07 января 2011

Недавно я расширил класс CWebUser , и теперь у него есть такие полезные методы:

Yii::app()->user->isAdmin;
Yii::app()->user->isTeacher;
Yii::app()->user->isStudent;

Теперь проблемы с accessControl filter.

Прежде, чтобы разрешить доступ только для администратора, я использовал:

public function accessRules()
    {
        return array(
            array('allow',
                'actions'=>array('index','update', 'create', 'delete'),
                'users'=>array('admin'),
            ),
            array('deny',
                'users'=>array('*'),
            ),
        );
    } 

Как переписать accessRules, чтобы делегировать доступ только тем пользователям, у которых есть атрибут Yii :: app () -> user-> isAdmin?

Ответы [ 2 ]

6 голосов
/ 07 января 2011

Вы можете добавить опцию «выражение» в конфигурацию. Обычно он получает $ user в качестве аргумента. Таким образом, вы можете сделать что-то вроде:

array('allow',
   'actions'=>array('index','update', 'create', 'delete'),
   'expression'=> '$user->isAdmin',
),

Обратите внимание, что я не проверял это, но думаю, что это будет работать.

Взгляните здесь для остальных.

1 голос
/ 20 августа 2012

Ну, это не сработает, потому что он знает Yii :: app () -> user как CWebUser Instance, и вы разработали класс UserIdentity, поэтому он сказал бы, что CWebUser и его поведение не имеют метода или замыкания с именем "isAdmin «'! Чтобы использовать такие выражения, как $ user-> isAdmin, вы должны установить свойство isAdmin, бросив команду setState, которая будет использовать сеанс, чтобы сохранить его, как правило, в методе аутентификации, чтобы это было что-то вроде этого:

class UserIdentity extends CUserIdentity
{
    public function authenticate() 
    {
        //your authentication code

        //using your functions like $level=$this->isTeacher();
        //or $level=$this->isAdmin();
        $this->setState('isAdmin',$level);
    }
}

и теперь в пользовательском контроллере в методе accessRules вы можете иметь выражения

public function accessRules()
{
    return array(
        array('allow',
            'actions'=>array('action1','action2',...),
            'expression'=>'$user->isAdmin',
            //or Yii::app()->user->getState('isAdmin'),
        ),
        //...
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...