Создание ролей(RBAC) и работа с ними

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
‡[анти]КИЉЕР‡
Сообщения: 14
Зарегистрирован: 2010.06.20, 13:23

Создание ролей(RBAC) и работа с ними

Сообщение ‡[анти]КИЉЕР‡ »

Здравствуйте.
Итак, столкнулся с проблемой, что не могу настроить роли.
Деле всё как на http://yiiframework.ru/doc/guide/ru/topics.auth
Что делаю. Создаю роли и назначаю им привелегии:

Код: Выделить всё

$auth=Yii::app()->authManager;

$auth->createOperation('viewDevices','просмотр устройств');
$auth->createOperation('createDevices','создание устройств');
$auth->createOperation('updateDevices','редактирование устройств');
$auth->createOperation('deleteDevices','удаление устройств');
 
$bizRule='return Yii::app()->user->isGuest;';
$role=$auth->createRole('guest','Гость',$bizRule);
 
$bizRule='return !Yii::app()->user->isGuest;';
$role=$auth->createRole('user','Пользователь',$bizRule);
$role->addChild('guest');
$role->addChild('viewDevices');
 
$bizRule='return User::model()->findByAttributes(array(\'user_id\' => Yii::app()->user->getId()),\'user_rank=1\')!=null';
$role=$auth->createRole('admin','Администратор',$bizRule);
$role->addChild('user');
$role->addChild('createDevices');
$role->addChild('updateDevices');
$role->addChild('deleteDevices'); 
При этом, как я понимаю, неавторизованному пользователю сразу должна соответствовать роль 'guest', а у любому авторизованному автоматом присваиваться роль 'user' (это следует из правил $bizRule).
Как роль по умолчанию в настройках стоит guest.

затем на странице делаю такой код:

Код: Выделить всё

if(Yii::app()->user->checkAccess('admin'))
{
    echo "Это админ!";
}

if(Yii::app()->user->checkAccess('user'))
{
    echo "Это юзер!";
}

if(Yii::app()->user->checkAccess('guest'))
{
    echo "Это гость!";
} 
Для гостя всё работает как надо - выводится "Это гость!". А вот есть зайти под любым другим пользователем - то уже не выводится "Это юзер!" или "Это админ!". Почему? Вроде правило соответствующее, и отдельно каждое правило возвращает то что нужно. Ну т.е. в любом случае если пользователь авторизован для него справедливо !Yii::app()->user->isGuest;.
так же для админа отдельно его правило возвращает не null, а обьект, если зайти под админом (правило говорит что у пользователя, с текущем id, поле user_rank должно быть равно 1)
Или же обязательно каждого существующего пользователя нужно добавлять роль через $auth->assign('user',1);, где 1- это id пользователя.

Аватара пользователя
samdark
Администратор
Сообщения: 9404
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Создание ролей(RBAC) и работа с ними

Сообщение samdark »

Сохранить роли забыли?

‡[анти]КИЉЕР‡
Сообщения: 14
Зарегистрирован: 2010.06.20, 13:23

Re: Создание ролей(RBAC) и работа с ними

Сообщение ‡[анти]КИЉЕР‡ »

Да, оказывается нужно в конце вызвать ещё $auth->save();, не знал об этом. Не было об этом сказано на той странице.
Однако это не изменило ничего. Хотя в таблицы "AuthItem" и "AuthItemChild" данные пишутся.

Но по прежнему лишь для гостя выводится "это гость". А для остальных - нет.

Однако, если установить соответствие роли пользователю, например так:

Код: Выделить всё

$auth->assign('user',1);
$auth->assign('admin',0);
То тогда всё работает.
Но можно ли сделать, чтобы без установки соответствия через $auth->assign роли присваивались на основе правил.
В моём случае например очень хотелось бы чтобы, к примеру, любой авторизованный пользователь имел роль "user" всегда + ему ещё могут присваиваться другие роли опять же на основе правил, а не через $auth->assign.

Аватара пользователя
samdark
Администратор
Сообщения: 9404
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: Создание ролей(RBAC) и работа с ними

Сообщение samdark »

Можно:

Код: Выделить всё

'authManager' => array(
  'class' => 'PhpAuthManager',
  'defaultRoles' => array('user', 'other_rule'),
  'showErrors' => YII_DEBUG
),
 
Но вот часть с «+ ему ещё могут присваиваться другие роли» лучше реализовать через $auth->assign. Менее накладно будет.

Ответить