Yii2-RBAC доступ к разделу

Всё про контроль доступа пользователей: фильтры, RBAC, проверки
Ответить
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Yii2-RBAC доступ к разделу

Сообщение porcelanosa »

Использую расширения Yii2-user и Yii2-RBAC от dektrium

Есть к примеру модель Categories и нужно обеспечить доступ пользователя только к конкретной категории.

Есть идея в контроллер добавить просто проверку вручную (ну или дописать какой-то интерфейс для настройки) if( id категории == id юзера)
Но там дальше пойдут проверки на доступ к содержимому (например, товарам) в разделе и т.д.

Как проще и правильнее это сделать?
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: Yii2-RBAC доступ к разделу

Сообщение someweb »

Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: Yii2-RBAC доступ к разделу

Сообщение porcelanosa »

Спасибо.
Т.е., как я поняла, в execute для правила можно любую логику задать.
Параметры туда передаются из behaviors -> access

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

[
    'allow' => true,
    'actions' => ['update'],
    'roles' => ['updatePost'],
    'roleParams' => ['postId' => Yii::$app->request->get('id')];
],
Но как же нам привязать кастомного юзера к категории?
Или тут надо отдельный механизм придумывать?
Т.е. какую-то таблицу соответствий - категория->юзер ?
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Yii2-RBAC доступ к разделу

Сообщение Dominus »

Вы не привязываете к категории пользователя, а даёте ему права на запрет или разрешение доступа.
Создаёте новое правило, например viewCategory, привязываете его к пользователю, и при доступе к категории, проверяете пользователя на наличие этого правила.

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

if (\Yii::$app->user->can('viewCategory')) {
    // Доступ разрешен
}
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: Yii2-RBAC доступ к разделу

Сообщение 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];
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Yii2-RBAC доступ к разделу

Сообщение 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 'Доступ запрещен!';
}
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: Yii2-RBAC доступ к разделу

Сообщение porcelanosa »

Dominus писал(а): 2017.11.08, 20:14 Ну можно как то так:
Спасибо, большое.
Но интерфейс для связи категорий и пользователей все равно понадобится (тот самый массив из примера)
Буду пробовать.
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Yii2-RBAC доступ к разделу

Сообщение Dominus »

Можно id пользователей хранить в таблице категорий в сериализованном виде, но понадобится еще одно поле, например users_access и тогда пользователей можно добавлять/удалять в интерфейсе добавления или редактирования категорий.
Тогда Rule будет как то так:

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

if(isset($params['post']->users_access)) {
    $array = unserialize($params['post']->users_access);   
    return in_array($user, $array);
}
return false;
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Yii2-RBAC доступ к разделу

Сообщение 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;
О да, потом очень удобно запросы делать. Если не сериализовывать, то нельзя "добавлять/удалять в интерфейсе добавления или редактирования категорий"?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Yii2-RBAC доступ к разделу

Сообщение Dominus »

Nerf писал(а): 2017.11.08, 23:49 О да, потом очень удобно запросы делать. Если не сериализовывать, то нельзя "добавлять/удалять в интерфейсе добавления или редактирования категорий"?
Ну вообще то акцент на сериализацию тут не делается, всё зависит от задачи. В некоторых случаях массив в БД удобнее хранить строкой.

Если мне не нужно делать запросы к users_access, а только хранить там данные для доступа, зачем мне еще одна таблица, если для данной задачи достаточна такая реализация?

Хочется делать удобно запросы, делайте как вам надо, не вижу проблемы, всё в ваших руках)
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Аватара пользователя
porcelanosa
Сообщения: 570
Зарегистрирован: 2010.03.16, 04:31
Откуда: Москва

Re: Yii2-RBAC доступ к разделу

Сообщение porcelanosa »

Согласна - интерфейс для управления привязкой пользователей к категориям может быть любым.
mcintosh-club.ru - первый мой сайт с использование Yii //
Акустика Sonus Faber Hi-End класса//
Необрезная доска и другие пиломатериалы
Ответить