Rbac и AccessControl

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
makbeth
Сообщения: 52
Зарегистрирован: 2014.01.06, 11:27

Rbac и AccessControl

Сообщение makbeth » 2014.12.18, 23:55

Что-то я не совсем понимаю как сделать доступ к действиям по ролям через AccessControl...
В общем сделал новое advanced приложение, добавил в таблице users поле role, которое принимает текстовое значение роли (user, moder, admin). Полностью все скопипастил с этой статьи: http://rgblog.ru/page/yii2-i-rbac-kontr ... nove-rolej и не работает. При таком коде в frontend/SiteController.php:

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

 'access' => [
                'class' => AccessControl::className(),
                'rules' => [
                    [
                        'actions' => ['login', 'error'],
                        'allow' => true,
                    ],
                    [
                        'actions' => ['logout', 'index'],
                        'allow' => true,
                        'roles' => ['user'],
                    ],
                ],
            ], 
не пускает в действие index, если 'roles' => ['admin'], то тоже не пустит. Получается или у меня руки кривые, либо в статье ошибка. Подскажите, пожалуйста что не так? По статье делал один в один что бы глянуть как вообще rbac работает, а тут вот такое дело... Буду очень благодарен за помощь.

german.igortcev
Сообщения: 225
Зарегистрирован: 2014.08.18, 14:01

Re: Rbac и AccessControl

Сообщение german.igortcev » 2014.12.19, 01:04

Прочитай офф документацию http://www.yiiframework.com/doc-2.0/gui ... ation.html

Напомню, что нужно проверять операции, а не роли, начиная с низов иерархии.

И прочитай http://habrahabr.ru/post/177873/ это хорошая статья правда для 1ой версии, но после прочтения начнешь понимать.

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Rbac и AccessControl

Сообщение zelenin » 2014.12.19, 01:09


german.igortcev
Сообщения: 225
Зарегистрирован: 2014.08.18, 14:01

Re: Rbac и AccessControl

Сообщение german.igortcev » 2014.12.19, 01:19

zelenin писал(а):https://github.com/zelenin/yii2-rbac-module#phpmanager
используй модуль
Да, поможет, но ему нужно полностью понять как работает rbac тогда он сможет использовать его.

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Rbac и AccessControl

Сообщение zelenin » 2014.12.19, 01:21

german.igortcev писал(а):
zelenin писал(а):https://github.com/zelenin/yii2-rbac-module#phpmanager
используй модуль
Да, поможет, но ему нужно полностью понять как работает rbac тогда он сможет использовать его.
да он настроить не может. причем тут понимание?

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

Re: Rbac и AccessControl

Сообщение samdark » 2014.12.19, 04:16

Поле User.role не надо. RBAC и так хранит для каждого юзера роли.

Аватара пользователя
vitalik1183
Сообщения: 1673
Зарегистрирован: 2014.07.01, 08:42

Re: Rbac и AccessControl

Сообщение vitalik1183 » 2014.12.19, 08:57

Sam Dark писал(а):Поле User.role не надо. RBAC и так хранит для каждого юзера роли.
А как же тогда указывать что пользователь А имеет такую то роль, а пользователь В такую то?
Yii2!

Аватара пользователя
Roksalana
Сообщения: 213
Зарегистрирован: 2014.01.14, 09:34

Re: Rbac и AccessControl

Сообщение Roksalana » 2014.12.19, 09:20

vitalik1183 писал(а):
Sam Dark писал(а):Поле User.role не надо. RBAC и так хранит для каждого юзера роли.
А как же тогда указывать что пользователь А имеет такую то роль, а пользователь В такую то?
В статье пропущен кусок кода, где пользователю присваивается роль.

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

$userRole = Yii::$app->authManager->getRole('name_of_role');
Yii::$app->authManager->assign($userRole, $user->getId());
 
В статье наверно (автор не я) подразумевается, что такую привязку вы сделали при добавлении пользователя в БД.

Посмотрите мой модуль: https://github.com/developeruz/yii2-db-rbac мне кажется, что вам будет легче пользоваться им, чем настраивать права вручную.

Аватара пользователя
Roksalana
Сообщения: 213
Зарегистрирован: 2014.01.14, 09:34

Re: Rbac и AccessControl

Сообщение Roksalana » 2014.12.19, 09:26

Sam Dark писал(а):Поле User.role не надо. RBAC и так хранит для каждого юзера роли.
Или можно прописать роль в таблице User и при логине привязывать роль

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

//удаляем ранее привязанные на всякий случай
Yii::$app->authManager->revokeAll($user->getId());
//и добавляем привязку 
$userRole = Yii::$app->authManager->getRole('name_of_role');
Yii::$app->authManager->assign($userRole, $user->getId());
 
До логина роль с таким именем должна существовать в правилах RBAC. Имхо, присваивать роли каждый раз при логине не практично. Роль у пользователя скорее всего меняться будет не часто. Пример выше написала только для того, чтобы вам легче было разобраться в том, как работает RBAC и присвоение ролей.

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

Re: Rbac и AccessControl

Сообщение samdark » 2014.12.19, 12:31

А как же тогда указывать что пользователь А имеет такую то роль, а пользователь В такую то?
Это делается один раз при регистрации или консольной командой или миграцией:

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

$auth = Yii::$app->authManager;
$authorRole = $auth->getRole('author');
$auth->assign($authorRole, $user->getId());
 
В документации подробно описано:

http://www.yiiframework.com/doc-2.0/gui ... ation.html

Аватара пользователя
vitalik1183
Сообщения: 1673
Зарегистрирован: 2014.07.01, 08:42

Re: Rbac и AccessControl

Сообщение vitalik1183 » 2014.12.19, 14:45

Sam Dark писал(а):
А как же тогда указывать что пользователь А имеет такую то роль, а пользователь В такую то?
Это делается один раз при регистрации или консольной командой или миграцией:

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

$auth = Yii::$app->authManager;
$authorRole = $auth->getRole('author');
$auth->assign($authorRole, $user->getId());
В документации подробно описано:

http://www.yiiframework.com/doc-2.0/gui ... ation.html
А если изменили роль впоследствии? Скажем админ поменял роль.

Дак я все понимаю, что при регистрации. Но текущая роль же должна храниться все равно где то? Или php уже обладает даром ясновидения и помнит что вася админ а петя менеджер? :)
Yii2!

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Rbac и AccessControl

Сообщение zelenin » 2014.12.19, 14:53

vitalik1183 писал(а): Дак я все понимаю, что при регистрации. Но текущая роль же должна храниться все равно где то? Или php уже обладает даром ясновидения и помнит что вася админ а петя менеджер? :)
а assign, как думаете, что делает? именно запоминает. Либо в файл, либо в БД.

Аватара пользователя
vitalik1183
Сообщения: 1673
Зарегистрирован: 2014.07.01, 08:42

Re: Rbac и AccessControl

Сообщение vitalik1183 » 2014.12.19, 15:46

В табличку юзеров или в отдельную? :)
Yii2!

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Rbac и AccessControl

Сообщение zelenin » 2014.12.19, 15:51

vitalik1183 писал(а):В табличку юзеров или в отдельную? :)
то есть вы даже доков не читали? у рбак отдельная таблица

Аватара пользователя
vitalik1183
Сообщения: 1673
Зарегистрирован: 2014.07.01, 08:42

Re: Rbac и AccessControl

Сообщение vitalik1183 » 2014.12.19, 16:32

zelenin писал(а):
vitalik1183 писал(а):В табличку юзеров или в отдельную? :)
то есть вы даже доков не читали? у рбак отдельная таблица
Нет, просто у меня айди роли хранится в таблице(пользователей). А потом я делаю по рецепту http://rgblog.ru/page/yii2-i-rbac-kontr ... nove-rolej и все задачи пока решаются. Не знаю насколько верно, может подскажите, как грамотно описан данный материал?

p.s. доки уже читаю, понимаю, что похоже делал эту штуку не очень грамотно!
Yii2!

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

Re: Rbac и AccessControl

Сообщение samdark » 2014.12.19, 21:56

Ну вот в доках нормально и описано.

Аватара пользователя
Dzhemal
Сообщения: 20
Зарегистрирован: 2014.11.18, 12:00

Re: Rbac и AccessControl

Сообщение Dzhemal » 2015.01.15, 16:17

У меня такая проблема возникла.
Хочу чтобы роль присваивалась при регистрации пользователя. Делаю и так как в оф доке написано:

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

$auth = Yii::$app->authManager;
$authorRole = $auth->getRole('author');
$auth->assign($authorRole, $user->getId());
  
и так пишу:

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

$userRole = Yii::$app->authManager->getRole('user');
            Yii::$app->authManager->assign($userRole, $user->getId()); 
а он выдает ошибку что Caused by: PDOException
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'user_id' cannot be null.

Я конечно согласен, так как когда пишу:

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

$userRole = Yii::$app->authManager->getRole('user');
            Yii::$app->authManager->assign($userRole, 5); 
то всё прекрасно работает. Но вот как правильно исправить, увы ...подскажите пожалуйста

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Rbac и AccessControl

Сообщение zelenin » 2015.01.15, 17:23

очевидно, что $user->getId() не возвращает id

Аватара пользователя
VaNnOrus
Сообщения: 96
Зарегистрирован: 2014.10.09, 12:50

Re: Rbac и AccessControl

Сообщение VaNnOrus » 2015.01.15, 17:28

Dzhemal писал(а):У меня такая проблема возникла.
Хочу чтобы роль присваивалась при регистрации пользователя. Делаю и так как в оф доке написано:

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

$auth = Yii::$app->authManager;
$authorRole = $auth->getRole('author');
$auth->assign($authorRole, $user->getId());
и так пишу:

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

$userRole = Yii::$app->authManager->getRole('user');
            Yii::$app->authManager->assign($userRole, $user->getId());
а он выдает ошибку что Caused by: PDOException
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'user_id' cannot be null.

Я конечно согласен, так как когда пишу:

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

$userRole = Yii::$app->authManager->getRole('user');
            Yii::$app->authManager->assign($userRole, 5);
то всё прекрасно работает. Но вот как правильно исправить, увы ...подскажите пожалуйста
Не понятно что Вы и где делаете.
Роль присваивать нужно в моделе юзеров в методе afterSave, потому что очевидно, что до сохранения пользователя в базе у него еще нет id.

Ответить