RBAC

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
ShNURoK
Сообщения: 168
Зарегистрирован: 2012.04.12, 05:44
Контактная информация:

RBAC

Сообщение ShNURoK » 2014.11.26, 16:35

Здравствуйте.
У меня такой вопрос, все стандартно,:
Есть список постов.
Есть несколько ролей (admin, author, user...).

Как правильно или вообще как, вывести посты, но с условием, что какие-то не видит user, какие-то author, admin по старинке видит все.
Если на каждый пост вешать, что-то вроде Yii::$app->user->can('viewPost', ['id' => $id]), то все очень сильно замедляется.
Так как правило отработав и вернув true, запускает запросы в базу на поиски ролей. И так с каждым постом.
Как поступить если используется assignment.

Аватара пользователя
VaNnOrus
Сообщения: 96
Зарегистрирован: 2014.10.09, 12:50

Re: RBAC

Сообщение VaNnOrus » 2014.11.26, 16:55

Думаю нужно собирать запрос в базу с учетом роли, а не проверять все посты на странице.

ShNURoK
Сообщения: 168
Зарегистрирован: 2012.04.12, 05:44
Контактная информация:

Re: RBAC

Сообщение ShNURoK » 2014.11.26, 17:17

А как хранить права для определенной роли?
В таблице: role, post_id, canView?

Аватара пользователя
VaNnOrus
Сообщения: 96
Зарегистрирован: 2014.10.09, 12:50

Re: RBAC

Сообщение VaNnOrus » 2014.11.26, 17:21

В таблице постов поле кто может смотреть.

Вообще опишите задачу, по-моему Вы просто хотите реализовать неправильно.

Если Вы собирались хранить право для каждого поста отдельное - бред. А если постов миллион? Миллион прав? А если кроме постов придумать такую систему для чего-то еще? Жирная таблица прав выйдет. Про ассигнмент тейбл я уже вообще молчу. Количество прав умножить на количество юзверей...

ShNURoK
Сообщения: 168
Зарегистрирован: 2012.04.12, 05:44
Контактная информация:

Re: RBAC

Сообщение ShNURoK » 2014.11.26, 17:30

Форум, есть категории, у категорий есть форумы (разделы), например как на главной странице этого форума.
Необходима возможность спрятать от некоторых групп пользователей определенные форумы (разделы).
Например видят только администраторы или/и модераторы. Или видят все группы, а писать сообщения могут только администраторы.
Ну и так далее... ну главное идея, остальное сам.

Аватара пользователя
VaNnOrus
Сообщения: 96
Зарегистрирован: 2014.10.09, 12:50

Re: RBAC

Сообщение VaNnOrus » 2014.11.26, 17:35

Так возьмите какой-нибудь форум и посмотрите как там это сделали.
Сомневаюсь, что хоть в одном приличном форуме на каждую категорию на странице идет запрос в базу для проверки прав. Большие форумы тогда грузились бы явно не за сотые секунды.

Вообще Вам придется рбак переписывать по себя чуть больше, чем полностью.

ShNURoK
Сообщения: 168
Зарегистрирован: 2012.04.12, 05:44
Контактная информация:

Re: RBAC

Сообщение ShNURoK » 2014.11.26, 17:43

В одном из... используется отдельная таблица. По структуре похожей, что я выше приводил.
Спасибо за помощь. Буду че-нить городить.

Аватара пользователя
yiijeka
Сообщения: 3049
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: RBAC

Сообщение yiijeka » 2014.11.27, 08:24

Берёте таблицу role(user_id, role_id) и связываете с таблицей post(post_id,). Получается таблица role_post(post_id, role_id).
При сохранение поста вносите в role_post строки из select формы. При показе поста проверяете таблицу role_post на

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

 where post_id = $id, role_id=$role

ShNURoK
Сообщения: 168
Зарегистрирован: 2012.04.12, 05:44
Контактная информация:

Re: RBAC

Сообщение ShNURoK » 2014.11.27, 21:44

yiijeka, спасибо, попробую. Я так и думал делать, но тут rbac лесом идет или его действительно надо переписывать под себя.

Аватара пользователя
yiijeka
Сообщения: 3049
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: RBAC

Сообщение yiijeka » 2014.11.28, 09:00

У вас тут бизнес правило для одной операции "просмотр поста". Лесом никто не идёт. Чтобы написать бизнес правило, вам нужно знать зависимость id поста от id роли и проверить её. По-другому мне в голову ничего не приходит.

ShNURoK
Сообщения: 168
Зарегистрирован: 2012.04.12, 05:44
Контактная информация:

Re: RBAC

Сообщение ShNURoK » 2014.11.28, 22:47

Получается я увидел в вашем сообщении, что хотел сам увидеть, а не что вы написали.
Проблема в том, что при проверке права "просмотр поста", будет выполнятся бизнес правило (1 запрос), и в случае, если оно вернет true будет проверятся само право на просмотр поста данному пользователю (роли), еще запросы, причем в несколько таблиц.
И выходит, что на каждый пост по несколько запросов. Скорость заметно проседает.

Аватара пользователя
yiijeka
Сообщения: 3049
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь
Контактная информация:

Re: RBAC

Сообщение yiijeka » 2014.11.28, 23:47

Настроите кеширование, создайте view sql, несколько десятков запросов на один пост не страшно :) И сначала проверяется само разрешение на операцию, а потом уже бизнес правило.

Аватара пользователя
VaNnOrus
Сообщения: 96
Зарегистрирован: 2014.10.09, 12:50

Re: RBAC

Сообщение VaNnOrus » 2014.12.03, 11:56

yiijeka писал(а):несколько десятков запросов на один пост не страшно :)
Если речь о форуме, то такие проверки предполагаются при выводе списка категорий и списка тем.
Обычно на главной форума выводится список вообще всех категорий, не видел форумов, где главная делилась бы на страницы.

А теперь внимание вопрос - сколько займет времени генерация главной страницы форума, у которого 50 категорий при "десятке запросов" на проверку прав на каждую.
Нет смысла применять рбак там, где он не нужен. Не нужно проверять возможность смотреть кажлый пост при выводе списка постов. Это бред. Нужно генерировать (запрос в бд) этот список уже с учетом прав. В экшене списка постов должна быть единственная проверка - может ли пользователь "смотреть список постов". А право на просмотр каждого поста при просмотре этого поста и выяснять.

Maxxi
Сообщения: 27
Зарегистрирован: 2014.11.20, 22:39

Re: RBAC

Сообщение Maxxi » 2014.12.03, 12:23

VaNnOrus писал(а):
yiijeka писал(а):несколько десятков запросов на один пост не страшно :)
Если речь о форуме, то такие проверки предполагаются при выводе списка категорий и списка тем.
Обычно на главной форума выводится список вообще всех категорий, не видел форумов, где главная делилась бы на страницы.

А теперь внимание вопрос - сколько займет времени генерация главной страницы форума, у которого 50 категорий при "десятке запросов" на проверку прав на каждую.
Не нужно так категорично. То, что Вы не видели, не означает, что такого нет. :)
Например на движке phpbb назначаются права на раздел для каждой группы пользователей.
При выводе общего списка разделов для каждого пользователя делается один запрос на получение доступных для пользователя разделов. Запрос с соединением группы пользователей на права. И не нужно городить огород с десятками запросов. Главное разумная реализация.

Аватара пользователя
VaNnOrus
Сообщения: 96
Зарегистрирован: 2014.10.09, 12:50

Re: RBAC

Сообщение VaNnOrus » 2014.12.05, 18:30

Maxxi писал(а): Не нужно так категорично. То, что Вы не видели, не означает, что такого нет. :)
Например на движке phpbb назначаются права на раздел для каждой группы пользователей.
При выводе общего списка разделов для каждого пользователя делается один запрос на получение доступных для пользователя разделов. Запрос с соединением группы пользователей на права. И не нужно городить огород с десятками запросов. Главное разумная реализация.
Вот именно, что ни один нормальный движок не будет брать 50 первых сообщений и проверять на каждом может ли его смотреть текущий пользователь. Мало того, что как уже было сказано это будет дико долго, так еще и работать будет криво. Вот, к примеру, получили мы 50 сообщений из базы и 12 из них пользователь смотреть не может. Что делать? Не показывать их и добирать еще одним запросом 12 нехватающих на странице сообщений? В общем так задачу элементарно не решить.

ShNURoK
Сообщения: 168
Зарегистрирован: 2012.04.12, 05:44
Контактная информация:

Re: RBAC

Сообщение ShNURoK » 2014.12.06, 13:58

А потом, еще из 12, 3 выкинуть. Снова запрос, рекурсия батенька.

Ответить