yii RBAC и правила доступа к контроллерам yii

Я пытаюсь настроить RBAC, поэтому сделал несколько ролей для пользователей.

Теперь я пытаюсь понять, как сообщить контроллеру, какое действие должно быть доступно для какой роли.

В коде контроллеров я вижу это

public function accessRules()
{
    return array(
        array('allow',  // allow all users to perform 'index' and 'view' actions
            'actions'=>array('index','view'),
            'users'=>array('*'),
        ),
        array('allow', // allow authenticated user to perform 'create' and 'update' actions
            'actions'=>array('create','update'),
            'users'=>array('@'),
        ),
        array('allow', // allow admin user to perform 'admin' and 'delete' actions
            'actions'=>array('admin','delete'),
            'users'=>array('admin'),
        ),
        array('deny',  // deny all users
            'users'=>array('*'),
        ),

Теперь я думал, что «пользователи» означают роли пользователей RBAC, но я думаю, что совершенно ошибаюсь. Итак, с одной стороны у меня есть это accessRules, а с другой стороны у меня есть несколько ролей RBAC. Как я могу указать контроллеру использовать мои роли?

Обновление для Джонни

Звучит интересно.... Я сделал тестовое действие

public function actionNew()
    {
        echo 'TEST'; die;

затем я сделал правило доступным для всех, просто для теста

public function accessRules()
{
    return array(
        array('allow',  // allow all users to perform 'index' and 'view' actions
            'actions'=>array('index','view'),
            'users'=>array('*'),
        ),
        array('allow', // allow authenticated user to perform 'create' and 'update' actions
            'actions'=>array('create','update'),
            'users'=>array('@'),
        ),
        array('allow', // allow admin user to perform 'admin' and 'delete' actions
            'actions'=>array('admin','delete'),
            'users'=>array('admin'),
        ),
        array('deny',  // deny all users
            'users'=>array('*'),
        ),


        array('allow',
            'actions'=>array('new'),
            'users'=>array('*'),
        ),
    );
}

Но это не работает :( Любые идеи, почему?

Я получаю

Error 403
You are not authorized to perform this action.

ОБНОВЛЕНИЕ 2

OK тестовое действие работает с * пользователями.

Сейчас пытаюсь связать это со своими ролями и там застрял :(

array('allow',
        'actions'=>array('new'),
        'roles'=>array('role1'),
    ),

Не работает :(

на странице с кнопкой, которая вызывает это действие, у меня есть код проверки ролика

if(Yii::app()->user->checkAccess('role1')){
    echo "hello, I'm role1";
}

Последнее обновление для Джонни Спасибо за помощь, наконец-то я это сделал. Я не знаю почему, но проблема заключалась в том, что я должен поместить все эти новые действия перед массивом отказа.

Нравится

public function accessRules()
    {
        return array(
            array('allow',  // allow all users to perform 'index' and 'view' actions
                'actions'=>array('index','view'),
                'users'=>array('*'),
            ),
            array('allow', // allow authenticated user to perform 'create' and 'update' actions
                'actions'=>array('create','update'),
                'users'=>array('@'),
            ),
            array('allow', // allow admin user to perform 'admin' and 'delete' actions
                'actions'=>array('admin','delete'),
                'users'=>array('admin'),
            ),
            array('allow',
                'actions'=>array('new'),
                'roles'=>array('role1'),
            ),
            array('deny',  // deny all users
                'users'=>array('*'),
            ),



        );
    }

И в этом случае это работает. Раньше мое новое действие располагалось в коде после ошибки 'deny', вы можете проверить фрагменты кода в верхних обновлениях. Странно для меня, но теперь он работает нормально :)


person David    schedule 19.03.2014    source источник
comment
Это полные правила? Обычно я просто добавляю «новое» в существующий массив, где находятся ваш индекс и представление. Проверьте, что работает   -  person Jonnny    schedule 19.03.2014
comment
Обновлен с полным списком правил. Все равно не работает :(   -  person David    schedule 19.03.2014
comment
У вас уже есть это заявление для * пользователей. Удалите его и добавьте в эту строку new 'actions'=>array('index','view'), Самый первый массив правил   -  person Jonnny    schedule 19.03.2014
comment
проверьте обновление 2, пожалуйста   -  person David    schedule 19.03.2014
comment
СЕЙЧАС самое время использовать свой ответ, чтобы узнать, проходят ли ваши роли checkAccess(). В зависимости от бизнес-правил вам может потребоваться передать дополнительные параметры в метод checkAccess(). Но это вполне может потребовать другого вопроса, поскольку объем вопроса меняется.   -  person Jonnny    schedule 19.03.2014
comment
checkAccess работает, я обновил свой пост, чтобы показать, как я его проверяю.   -  person David    schedule 19.03.2014
comment
Нет. Из моего тестового оператора «если» я получаю «эхо» о том, что моя роль активна, затем я нажимаю ссылку, чтобы вызвать действие, и получаю ошибку 403. У вас нет прав для выполнения этого действия.   -  person David    schedule 19.03.2014
comment
Наконец я сделал это. Код работает. Я разместил это в обновлении.   -  person David    schedule 20.03.2014


Ответы (1)


Один из способов — вызвать что-то подобное в вашем контроллере:

if(Yii::app()->user->checkAccess('my_user_role')){ // Do something }

? анонимных пользователей

@ зарегистрированных пользователей

* любой пользователь вошел в систему или нет

admin также является именем пользователя, а не типом пользователя в данном случае

В вашем случае вы можете сделать это:

array('allow',
'actions'=>array('create','update'),
'users'=>array('@'),
'roles'=>array('myRole')
),

users указывает, какой тип пользователя из списка, упомянутого выше. Затем клавиша roles позволяет назначить вашу конкретную роль этой группе пользователей.

person Jonnny    schedule 19.03.2014
comment
ну это я понимаю, но я хочу интегрировать свои роли в тот скелет accessRules который используется во всех контроллерах этого фреймворка. По крайней мере, вы можете объяснить, что имеется в виду под «пользователями»? Просто имена пользователей??? Это «админ» - это имя пользователя или что? - person David; 19.03.2014
comment
Вы имеете в виду ключ пользователя, то есть * и @? - person Jonnny; 19.03.2014
comment
да *, @, админ, какие они? Я хочу поместить туда свои роли, поэтому я пытаюсь понять логику системы, откуда она берет эти *, @, admin, чтобы я мог повесить их со своими ролями. - person David; 19.03.2014