Страница 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
Да, поможет, но ему нужно полностью понять как работает rbac тогда он сможет использовать его.
Re: Rbac и AccessControl
Добавлено: 2014.12.19, 01:21
zelenin
german.igortcev писал(а):
Да, поможет, но ему нужно полностью понять как работает 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.