Страница 1 из 1

Rbac и AccessControl

Добавлено: 2014.12.18, 23:55
makbeth
Что-то я не совсем понимаю как сделать доступ к действиям по ролям через 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 работает, а тут вот такое дело... Буду очень благодарен за помощь.

Re: Rbac и AccessControl

Добавлено: 2014.12.19, 01:04
german.igortcev
Прочитай офф документацию http://www.yiiframework.com/doc-2.0/gui ... ation.html

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

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

Re: Rbac и AccessControl

Добавлено: 2014.12.19, 01:09
zelenin

Re: Rbac и AccessControl

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

Re: Rbac и AccessControl

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

Re: Rbac и AccessControl

Добавлено: 2014.12.19, 04:16
samdark
Поле User.role не надо. RBAC и так хранит для каждого юзера роли.

Re: Rbac и AccessControl

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

Re: Rbac и AccessControl

Добавлено: 2014.12.19, 09:20
Roksalana
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 мне кажется, что вам будет легче пользоваться им, чем настраивать права вручную.

Re: Rbac и AccessControl

Добавлено: 2014.12.19, 09:26
Roksalana
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 и присвоение ролей.

Re: Rbac и AccessControl

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

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

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

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

Re: Rbac и AccessControl

Добавлено: 2014.12.19, 14:45
vitalik1183
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 уже обладает даром ясновидения и помнит что вася админ а петя менеджер? :)

Re: Rbac и AccessControl

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

Re: Rbac и AccessControl

Добавлено: 2014.12.19, 15:46
vitalik1183
В табличку юзеров или в отдельную? :)

Re: Rbac и AccessControl

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

Re: Rbac и AccessControl

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

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

Re: Rbac и AccessControl

Добавлено: 2014.12.19, 21:56
samdark
Ну вот в доках нормально и описано.

Re: Rbac и AccessControl

Добавлено: 2015.01.15, 16:17
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); 
то всё прекрасно работает. Но вот как правильно исправить, увы ...подскажите пожалуйста

Re: Rbac и AccessControl

Добавлено: 2015.01.15, 17:23
zelenin
очевидно, что $user->getId() не возвращает id

Re: Rbac и AccessControl

Добавлено: 2015.01.15, 17:28
VaNnOrus
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.