Страница 1 из 1
Yii2-RBAC доступ к разделу
Добавлено: 2017.11.08, 13:24
porcelanosa
Использую расширения Yii2-user и Yii2-RBAC от
dektrium
Есть к примеру модель Categories и нужно обеспечить доступ пользователя только к конкретной категории.
Есть идея в контроллер добавить просто проверку вручную (ну или дописать какой-то интерфейс для настройки) if( id категории == id юзера)
Но там дальше пойдут проверки на доступ к содержимому (например, товарам) в разделе и т.д.
Как проще и правильнее это сделать?
Re: Yii2-RBAC доступ к разделу
Добавлено: 2017.11.08, 14:24
someweb
Re: Yii2-RBAC доступ к разделу
Добавлено: 2017.11.08, 14:49
porcelanosa
Спасибо.
Т.е., как я поняла, в execute для правила можно любую логику задать.
Параметры туда передаются из behaviors -> access
Код: Выделить всё
[
'allow' => true,
'actions' => ['update'],
'roles' => ['updatePost'],
'roleParams' => ['postId' => Yii::$app->request->get('id')];
],
Но как же нам привязать кастомного юзера к категории?
Или тут надо отдельный механизм придумывать?
Т.е. какую-то таблицу соответствий - категория->юзер ?
Re: Yii2-RBAC доступ к разделу
Добавлено: 2017.11.08, 16:23
Dominus
Вы не привязываете к категории пользователя, а даёте ему права на запрет или разрешение доступа.
Создаёте новое правило, например viewCategory, привязываете его к пользователю, и при доступе к категории, проверяете пользователя на наличие этого правила.
Код: Выделить всё
if (\Yii::$app->user->can('viewCategory')) {
// Доступ разрешен
}
Re: Yii2-RBAC доступ к разделу
Добавлено: 2017.11.08, 17:47
porcelanosa
Dominus писал(а): ↑2017.11.08, 16:23
Вы не привязываете к категории пользователя, а даёте ему права на запрет или разрешение доступа.
Создаёте новое правило, например viewCategory, привязываете его к пользователю, и при доступе к категории, проверяете пользователя на наличие этого правила.
Код: Выделить всё
if (\Yii::$app->user->can('viewCategory')) {
// Доступ разрешен
}
Мне надо дать права на конкретную категорию. А на все остальные запретить. В доках описана ситуация, когда привязка идет к сущности в которой есть параметр указывающий на пользователя, который ее создал (написал статью или создал пост). Или ситуация когда надо просто дать на возможность редактирование.
В моем случае такого параметра нет и создавать его нет смысла. Поскольку создать сущность может кто-то другой, а создавать сущность от имени пользователя, который в дальнейешем будет ее редактировать как то "костыльно".
т.е. вот тут мне надо
Код: Выделить всё
public function execute($user, $item, $params)
{
$cats = UserCats:find()->where('[user_id'=>$params['userId'])->all();
return isset($params['post']) ? in_array($params['postId'], $cats): false;
}
как-то вернуть true только для конкретного пользователя (списка пользователей)
передать сюда как-то так
Код: Выделить всё
'roleParams' => ['postId' => Yii::$app->request->get('id'), 'userId' => Yii::$app->user->identity->id];
Re: Yii2-RBAC доступ к разделу
Добавлено: 2017.11.08, 20:14
Dominus
Ну можно как то так:
Код: Выделить всё
class UsersAccessRule extends Rule
{
public $name = 'isUserAccess';
public function execute($user, $item, $params)
{
/**
* В качестве примера используется массив
* post_id => [user_id_1, user_id_2, ...]
*/
$array = [
1 => [1, 2], // разрешен доступ к посту с id=1 пользователям с id=1, id=2
2 => [2, 4, 5], // разрешен доступ к посту с id=2 пользователям с id=2, id=4, id=5
];
if(isset($array[$params['post']->id])) {
return in_array($user, $array[$params['post']->id]);
}
return false;
}
}
И проверка:
Код: Выделить всё
$model = $this->findModel($id);
if (\Yii::$app->user->can('accessUser', ['post' => $model])) {
echo 'Доступ разрешен!';
} else {
echo 'Доступ запрещен!';
}
Re: Yii2-RBAC доступ к разделу
Добавлено: 2017.11.08, 22:31
porcelanosa
Dominus писал(а): ↑2017.11.08, 20:14
Ну можно как то так:
Спасибо, большое.
Но интерфейс для связи категорий и пользователей все равно понадобится (тот самый массив из примера)
Буду пробовать.
Re: Yii2-RBAC доступ к разделу
Добавлено: 2017.11.08, 23:02
Dominus
Можно id пользователей хранить в таблице категорий в сериализованном виде, но понадобится еще одно поле, например users_access и тогда пользователей можно добавлять/удалять в интерфейсе добавления или редактирования категорий.
Тогда Rule будет как то так:
Код: Выделить всё
if(isset($params['post']->users_access)) {
$array = unserialize($params['post']->users_access);
return in_array($user, $array);
}
return false;
Re: Yii2-RBAC доступ к разделу
Добавлено: 2017.11.08, 23:49
Nerf
Dominus писал(а): ↑2017.11.08, 23:02
Можно id пользователей хранить в таблице категорий в сериализованном виде, но понадобится еще одно поле, например users_access и тогда пользователей можно добавлять/удалять в интерфейсе добавления или редактирования категорий.
Тогда Rule будет как то так:
Код: Выделить всё
if(isset($params['post']->users_access)) {
$array = unserialize($params['post']->users_access);
return in_array($user, $array);
}
return false;
О да, потом очень удобно запросы делать. Если не сериализовывать, то нельзя "добавлять/удалять в интерфейсе добавления или редактирования категорий"?
Re: Yii2-RBAC доступ к разделу
Добавлено: 2017.11.09, 00:59
Dominus
Nerf писал(а): ↑2017.11.08, 23:49
О да, потом очень удобно запросы делать. Если не сериализовывать, то нельзя "добавлять/удалять в интерфейсе добавления или редактирования категорий"?
Ну вообще то акцент на сериализацию тут не делается, всё зависит от задачи. В некоторых случаях массив в БД удобнее хранить строкой.
Если мне не нужно делать запросы к users_access, а только хранить там данные для доступа, зачем мне еще одна таблица, если для данной задачи достаточна такая реализация?
Хочется делать удобно запросы, делайте как вам надо, не вижу проблемы, всё в ваших руках)
Re: Yii2-RBAC доступ к разделу
Добавлено: 2017.11.09, 13:18
porcelanosa
Согласна - интерфейс для управления привязкой пользователей к категориям может быть любым.