Yii2-RBAC доступ к разделу
- porcelanosa
- Сообщения: 570
- Зарегистрирован: 2010.03.16, 04:31
- Откуда: Москва
Yii2-RBAC доступ к разделу
Использую расширения Yii2-user и Yii2-RBAC от dektrium
Есть к примеру модель Categories и нужно обеспечить доступ пользователя только к конкретной категории.
Есть идея в контроллер добавить просто проверку вручную (ну или дописать какой-то интерфейс для настройки) if( id категории == id юзера)
Но там дальше пойдут проверки на доступ к содержимому (например, товарам) в разделе и т.д.
Как проще и правильнее это сделать?
Есть к примеру модель Categories и нужно обеспечить доступ пользователя только к конкретной категории.
Есть идея в контроллер добавить просто проверку вручную (ну или дописать какой-то интерфейс для настройки) if( id категории == id юзера)
Но там дальше пойдут проверки на доступ к содержимому (например, товарам) в разделе и т.д.
Как проще и правильнее это сделать?
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
Re: Yii2-RBAC доступ к разделу
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
- porcelanosa
- Сообщения: 570
- Зарегистрирован: 2010.03.16, 04:31
- Откуда: Москва
Re: Yii2-RBAC доступ к разделу
Спасибо.
Т.е., как я поняла, в execute для правила можно любую логику задать.
Параметры туда передаются из behaviors -> access
Код: Выделить всё
[
'allow' => true,
'actions' => ['update'],
'roles' => ['updatePost'],
'roleParams' => ['postId' => Yii::$app->request->get('id')];
],
Или тут надо отдельный механизм придумывать?
Т.е. какую-то таблицу соответствий - категория->юзер ?
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
- Dominus
- Сообщения: 892
- Зарегистрирован: 2013.03.14, 21:27
- Откуда: Россия, Иваново
- Контактная информация:
Re: Yii2-RBAC доступ к разделу
Вы не привязываете к категории пользователя, а даёте ему права на запрет или разрешение доступа.
Создаёте новое правило, например viewCategory, привязываете его к пользователю, и при доступе к категории, проверяете пользователя на наличие этого правила.
Создаёте новое правило, например viewCategory, привязываете его к пользователю, и при доступе к категории, проверяете пользователя на наличие этого правила.
Код: Выделить всё
if (\Yii::$app->user->can('viewCategory')) {
// Доступ разрешен
}
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
- porcelanosa
- Сообщения: 570
- Зарегистрирован: 2010.03.16, 04:31
- Откуда: Москва
Re: Yii2-RBAC доступ к разделу
Мне надо дать права на конкретную категорию. А на все остальные запретить. В доках описана ситуация, когда привязка идет к сущности в которой есть параметр указывающий на пользователя, который ее создал (написал статью или создал пост). Или ситуация когда надо просто дать на возможность редактирование.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;
}
передать сюда как-то так
Код: Выделить всё
'roleParams' => ['postId' => Yii::$app->request->get('id'), 'userId' => Yii::$app->user->identity->id];
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
- Dominus
- Сообщения: 892
- Зарегистрирован: 2013.03.14, 21:27
- Откуда: Россия, Иваново
- Контактная информация:
Re: Yii2-RBAC доступ к разделу
Ну можно как то так:
И проверка:
Код: Выделить всё
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 'Доступ запрещен!';
}
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
- porcelanosa
- Сообщения: 570
- Зарегистрирован: 2010.03.16, 04:31
- Откуда: Москва
Re: Yii2-RBAC доступ к разделу
Спасибо, большое.
Но интерфейс для связи категорий и пользователей все равно понадобится (тот самый массив из примера)
Буду пробовать.
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
- Dominus
- Сообщения: 892
- Зарегистрирован: 2013.03.14, 21:27
- Откуда: Россия, Иваново
- Контактная информация:
Re: Yii2-RBAC доступ к разделу
Можно id пользователей хранить в таблице категорий в сериализованном виде, но понадобится еще одно поле, например users_access и тогда пользователей можно добавлять/удалять в интерфейсе добавления или редактирования категорий.
Тогда Rule будет как то так:
Тогда Rule будет как то так:
Код: Выделить всё
if(isset($params['post']->users_access)) {
$array = unserialize($params['post']->users_access);
return in_array($user, $array);
}
return false;
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Re: Yii2-RBAC доступ к разделу
О да, потом очень удобно запросы делать. Если не сериализовывать, то нельзя "добавлять/удалять в интерфейсе добавления или редактирования категорий"?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;
- Dominus
- Сообщения: 892
- Зарегистрирован: 2013.03.14, 21:27
- Откуда: Россия, Иваново
- Контактная информация:
Re: Yii2-RBAC доступ к разделу
Ну вообще то акцент на сериализацию тут не делается, всё зависит от задачи. В некоторых случаях массив в БД удобнее хранить строкой.
Если мне не нужно делать запросы к users_access, а только хранить там данные для доступа, зачем мне еще одна таблица, если для данной задачи достаточна такая реализация?
Хочется делать удобно запросы, делайте как вам надо, не вижу проблемы, всё в ваших руках)
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
- porcelanosa
- Сообщения: 570
- Зарегистрирован: 2010.03.16, 04:31
- Откуда: Москва
Re: Yii2-RBAC доступ к разделу
Согласна - интерфейс для управления привязкой пользователей к категориям может быть любым.
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы