Для проверки RBAC двух ролей уходит много запросов.

Всё про контроль доступа пользователей: фильтры, RBAC, проверки
Ответить
Stasgar
Сообщения: 77
Зарегистрирован: 2016.07.15, 14:08

Для проверки RBAC двух ролей уходит много запросов.

Сообщение Stasgar »

Разбираюсь с RBAC. Есть 4 разрешения - createPost,updatePost,deletePost,updateOwnPost. И 2 роли - admin и author.

Вывожу посты через gridView и добавляю кнопки с проверкой разрешений:

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

echo GridView::widget([
    'dataProvider' => $dataProvider,
    'columns'=>[
        ['class'=>'yii\grid\SerialColumn'],
        [
            'label'=>'User',
            'attribute'=>'users.userName'
        ],
        'title',
        'text',
        'date',
        'time',
        [
            'class' => 'yii\grid\ActionColumn',
            'header'=>'Actions',
            'template'=>'{view} {update} {delete} ',
            'buttons'=>[
                'view'=>function($url)
                {
                    return Html::a('Открыть',$url);
                },
                'delete'=>function($url)
                {
                    return Yii::$app->user->can('deletePost') ? Html::a('Удалить',$url) :  null ;
                },
                'update' => function($url, $model) {
                     return Yii::$app
                         ->user
                         ->can('updatePost', ['posts' => $model]) ? Html::a('Изменить', $url) :  null ;
                }
            ]
        ],
    ]
]);
Таким образом получается на 10 постов - 99 запросов в БД, если не админ (под админом - 56). Это нормально, или где-то есть косяк? Роли сделал примерно так-же, как и в официальном гайде. Без проверки кнопочек - всего 10.
Последний раз редактировалось Stasgar 2016.08.07, 15:59, всего редактировалось 1 раз.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Для проверки RBAC двух ролей уходит много запросов.

Сообщение maleks »

У рбака есть кеширование, а так, да, создает много запросов
Yii2 universal module sceleton - for basic and advanced templates
Stasgar
Сообщения: 77
Зарегистрирован: 2016.07.15, 14:08

Re: Для проверки RBAC двух ролей уходит много запросов.

Сообщение Stasgar »

maleks писал(а):У рбака есть кеширование, а так, да, создает много запросов
Если вырезать проверку кнопки update - то сразу запросов 80 исчезают.

Вот правило для updateOwnPost:

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

    public function execute($user, $item, $params)
    {
        return isset($params['posts']) ? $params['posts']->user == $user : false;
    }

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

$rule = new \app\rbac\AuthorRule;
        $auth->add($rule);

        $updateOwnPost = $auth->createPermission('updateOwnPost');
        $updateOwnPost->description = 'Update own post';
        $updateOwnPost->ruleName = $rule->name;
        $auth->add($updateOwnPost);

        $auth->addChild($updateOwnPost,$updatePost);
        
        $auth->addChild($author,$updateOwnPost);
Может быть у меня какая грубая ошибка? Просто странно, что запросов так много.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Для проверки RBAC двух ролей уходит много запросов.

Сообщение maleks »

Да, 8 запросов на одну проверку многовато.
А чего не проверяешь ?:
->can('updateOwnPost'
Yii2 universal module sceleton - for basic and advanced templates
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Для проверки RBAC двух ролей уходит много запросов.

Сообщение Nerf »

maleks писал(а):Да, 8 запросов на одну проверку многовато.
А чего не проверяешь ?:
->can('updateOwnPost'
А нужно?...
Stasgar
Сообщения: 77
Зарегистрирован: 2016.07.15, 14:08

Re: Для проверки RBAC двух ролей уходит много запросов.

Сообщение Stasgar »

Nerf писал(а): А нужно?...
Видимо нужно, ибо с 99 запросов спустилось до 59.
Но что-то все равно как-то много мне кажется на 10 строчек...
Stasgar
Сообщения: 77
Зарегистрирован: 2016.07.15, 14:08

Re: Для проверки RBAC двух ролей уходит много запросов.

Сообщение Stasgar »

maleks писал(а): ->can('updateOwnPost'
В официальном мануале просто было написано так, как я сделал. Не думал, что можно так. 59 запросов на 10 строчек в каждой по 2 проверки rbac - это норма(ну понятно, что без кэширования)?
Stasgar
Сообщения: 77
Зарегистрирован: 2016.07.15, 14:08

Re: Для проверки RBAC двух ролей уходит много запросов.

Сообщение Stasgar »

Так, ладно. В общем понял суть, все так и должно работать. Как я понимаю на практике не используют DbManager? Каким образом нужно настроить PhpManager, чтобы, допустим, название роли хранилось в таблице Users, а не в assignments.php?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Для проверки RBAC двух ролей уходит много запросов.

Сообщение zelenin »

Stasgar писал(а):Как я понимаю на практике не используют DbManager?
почему?
Stasgar писал(а):Каким образом нужно настроить PhpManager, чтобы, допустим, название роли хранилось в таблице Users?
https://github.com/zelenin/yii2-rbac-module
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Для проверки RBAC двух ролей уходит много запросов.

Сообщение ElisDN »

Stasgar писал(а):Каким образом нужно настроить PhpManager, чтобы, допустим, название роли хранилось в таблице Users, а не в assignments.php?
Переопределить методы, работающие с assignments, на работу с полем в базе:

http://www.elisdn.ru/blog/87/seo-servic ... dding-rbac
http://www.elisdn.ru/blog/88/seo-servic ... extensions
Stasgar
Сообщения: 77
Зарегистрирован: 2016.07.15, 14:08

Re: Для проверки RBAC двух ролей уходит много запросов.

Сообщение Stasgar »

zelenin писал(а):почему?
Чтобы снять нагрузку с БД. Мне кажется обратиться к четырем файлам, которые вернут массивы - требует меньше русурсов, чем обращаться к 4м таблицам из БД, но утверждать не буду.
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Для проверки RBAC двух ролей уходит много запросов.

Сообщение Nerf »

Stasgar писал(а):
Nerf писал(а): А нужно?...
Видимо нужно, ибо с 99 запросов спустилось до 59.
Но что-то все равно как-то много мне кажется на 10 строчек...
Но вы проверяете доступ лишь частично. Можно вообще не проверять, ибо будет 0 запросов.
Stasgar
Сообщения: 77
Зарегистрирован: 2016.07.15, 14:08

Re: Для проверки RBAC двух ролей уходит много запросов.

Сообщение Stasgar »

Nerf писал(а):Но вы проверяете доступ лишь частично.
Понял, что частично. Не понял - как это происходит)

Вот я создал правило из AuthorRule, добавил его к разрешению updateOwnPost, и разрешение это добавил в менеджер.

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

        $rule = new \app\rbac\AuthorRule;
        $auth->add($rule);

        $updateOwnPost = $auth->createPermission('updateOwnPost');
        $updateOwnPost->description = 'Update own post';
        $updateOwnPost->ruleName = $rule->name;
        $auth->add($updateOwnPost);

        $auth->addChild($updateOwnPost,$updatePost);
А что будет тогда означать последняя строчка? В документации написано "updateOwnPost будет использоваться из updatePost" - это что значит? Не могу понять по какому алгоритму происходит проверка в данном случае...
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Для проверки RBAC двух ролей уходит много запросов.

Сообщение maleks »

Вспомнил про что в доке.
Конечно надо проверять ->can('updatePost'
Stasgar писал(а): это что значит?
Чтобы точно понять что происходит, смотрите код ядра yii, а точнее - DbManager::checkAccessRecursive
Смысл в том что делая addChild мы указываем на все что принадлежит родителю.
Поэтому проверяя какую то позицию, рекурсивно проверяется также имеет ли пользователь во владении любого из предков искомой позиции.
Вот у тебя для admin проверка UpdatePost сразу находит.
А для author, у него нет UpdatePost , но у UpdatePost есть родитель UpdateOwnPost и начинается его проверка и вот она как раз и сработает.
Но это и будут все вот эти доп запросы к БД.

Я лично так бы не делал.
UpdatePost - это по сути UpdateAllPosts. И UpdateOwnPost можно никак к нему не связывать, и проверять раздельно.
И в проверке просто будет:
до GridView можно проверить ->can('UpdateAllPosts' и если нельзя то для каждого проверять UpdateOwnPost
Yii2 universal module sceleton - for basic and advanced templates
Stasgar
Сообщения: 77
Зарегистрирован: 2016.07.15, 14:08

Re: Для проверки RBAC двух ролей уходит много запросов.

Сообщение Stasgar »

Я, вроде, понял суть. Конечная цель - проверить не пермишн, а роль, к которой он принадлежит, и сравнить ее с ролью пользователя.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Для проверки RBAC двух ролей уходит много запросов.

Сообщение maleks »

Stasgar писал(а):Я, вроде, понял суть. Конечная цель - проверить не пермишн, а роль, к которой он принадлежит, и сравнить ее с ролью пользователя.
типа того. Только не с ролью, а с ролями. Теми что были пользователю присвоены. Хотя пермишены вроде тоже технически можно присваивать.
Yii2 universal module sceleton - for basic and advanced templates
Nerf
Сообщения: 780
Зарегистрирован: 2015.01.29, 00:37

Re: Для проверки RBAC двух ролей уходит много запросов.

Сообщение Nerf »

maleks писал(а): Я лично так бы не делал.
UpdatePost - это по сути UpdateAllPosts. И UpdateOwnPost можно никак к нему не связывать, и проверять раздельно.
И в проверке просто будет:
до GridView можно проверить ->can('UpdateAllPosts' и если нельзя то для каждого проверять UpdateOwnPost
И еще пару костылей подмешать и будет хорошо :mrgreen:
Наверное, стоит в сторону кеширования посмотреть и в саму реализацию правила. Схемы закешировать таблиц. Потом пытаться костылить. Мне одно интересно, как вы определяете, что такое много запросов, а что такое мало?..
maleks писал(а): Хотя пермишены вроде тоже технически можно присваивать.
По сути они от ролей ничем не отличаются.
Аватара пользователя
maleks
Сообщения: 1985
Зарегистрирован: 2012.12.26, 12:56

Re: Для проверки RBAC двух ролей уходит много запросов.

Сообщение maleks »

Nerf писал(а): Наверное, стоит в сторону кеширования посмотреть и в саму реализацию правила. Схемы закешировать таблиц.
Очень ценный совет кэп. :)
И да, общайся с ТС, он же просит помощи, не я.
Yii2 universal module sceleton - for basic and advanced templates
Ответить