@akdes

Концепция прав пользователя сайта, как сделать?

Добрый день, есть своя CMS/Продукт, в которой отсутствует (пока)система прав.

Есть необходимость сделать следующее:
Заходя на сайт, пользователь имеет несколько пунктов(модулей/плагинов), буду называть их выдуманными именами, дабы не пришлось писать документацию.
Юзер имеет одну или несколько организаций (список для выбора)
Организация Х:
Плагин А
-можно создать/удалить/изменить "что-то"
--каждое "что-то" имеет н-ое количество инпут/текстареа/чекбокс и.тд.

Плагин Б
... смотри выше...

Есть необходимость создать систему прав вплоть до инпута.
т.е. юзер может CRUD всю организацию или
юзер может CRUD Плагин А
а в Плагин Б может менять только один инпут.
*CRUD - Create Read Update Delete
Ищу как это всё правильно спланировать/сделать.
Думал идти по "цепи"
юзер имеет право:
ОрганизацияX.* | CRUD
ОрганизацияX.ПлагинБ.что-то.Инпут | RU
и сюда же m:n юзер_право

При этом каждый контроллер должен знать что он относится к Плагину и тогда:
если запрос от юзера А из Организации Б на Плагин В и меняют Чекбокс то происходит запрос в БД
на ОрганизацияБ.ПлагинВ.что-то.Чекбокс и так как такого нет, то полетит исключение или false

Хотелось бы услышать мнение, опыт или предложения по улучшению или изменению сего концепта.
Разработка идёт на laravel, точнее будет переписываться, с актуальной версией.
Заранее благодарен.
  • Вопрос задан
  • 279 просмотров
Пригласить эксперта
Ответы на вопрос 3
dimonchik2013
@dimonchik2013
non progredi est regredi
это называется RBAC
Ответ написан
Комментировать
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
как заметили выше RBAC или ACL
Ответ написан
Комментировать
Q2W
@Q2W
Большинство оптимизаций производительности обычно сводится к тому, чтобы тяжёлую работу выполнять не тогда, когда нужно быстро получить результат, и вообще снизить объём работы.

А большинство оптимизаций надёжности, скорости разработки и вообще стоимости владения кодом обычно сводится к его уменьшению и упрощению.

Поэтому в любом случае придётся в каких-то моментах выбирать или-или.

На счёт производительного слоя доступа, я делаю обычно примерно так:
Вот у меня есть объекты, настройки доступа к которым влияют на другие объекты, доступ к которым тоже настраивается (буду использовать в качестве примера папки).
При смене настроек доступа к папке для каждой подпапки я вычисляю эффективные настройки доступа. Т.е. посколько запреты доступа на родительской папке добавляются к запретам на дочерней, то эффективные настройки доступа дочерней включают и те запреты, и эти.
Так вот для каждой папки я храню не только изначальные настройки доступа, которые юзер задал конкретно этой папке, но и все запреты всех родительских папок до корня.
Так мне при решении о том, давать ли доступ к каждому объекту не нужно загружать из БД настройки доступа всех родительских объектов. Но за то изменение настроек доступа замедляется. Обычно это ок.

Если этого недостаточно, то вот как я оптимизирую получение списка доступных объектов.
Обычно все выборки объектов можно как-то систематизировать. Например, в случае с папками и файлами выборки бывают такими:
1. Список подпапок папки A.
2. Список файлов папки А в сортировке по рейтингу.
3. Список файлов папки А в сортировке по дате создания.
4. Список файлов папки А и всех её подпапок в сортировке по рейтингу.
5. Список файлов папки А и всех её подпапок в сортировке по дате создания.

Настройки доступа к папкам меняют видимость целых кусков таких выборок. Например, для выборки №1 - для каких-то юзеров может появиться или пропасть один элемент из-за изменения на нём настройки доступа.
Для выборок 2 и 3 может пропасть или появиться сразу всё содержимое выборки.
Для выборок 4 и 5 может пропасть или появиться та часть выборки, которая находится непосредственно в папке и изменённой настройкой доступа, а так же в её подпапках.

Так вот можно нарезать уникальных фрагментов всех выборок так, что каждый фрагмент будет содержать файлы с уникальным набором запретов доступа. Потом эти фрагменты нужно где-то хранить. Это производная выборка от целевой.
Т.е. если целевая выборка - это просто выборка всех файлов папки в какой-то сортировке, а слой доступа уже после выборке должен нафильтровать только доступные, то у нас будет не так, ибо это дорого. У нас заранее будет готов список объектов, доступный по определённому уникальному набору запретов.
А когда происходит запрос на выборку доступных объектов, мы узнаём, какие вообще есть фрагменты, какие у них настройки доступа, какие из них доступны нашему юзеру.
Потом выбираем из БД содержимое всех доступных фрагментов и, поскольку внутри это сортированные списке, сливаем их занедорого.
Так же недорого можем получить такой список со смещением. Т.о. можем получать не весь список целиком, ведь он может быть очень большим, но и брать его частями. Например, для постраничного вывода.
Но это будет работать только если настройки доступа к папкам не особенно разнообразны. Обычно это так и есть.

В общем вот в таком ключе обычно всё.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы