#веб_программирование #spring #usercontrol #права #acl
Проектирую сайт, в котором каждый зарегистрированный пользователь, может создавать
записи к примеру как в evernote или в том же google диске.
Всего на сайте есть 4 роли (Админ, Модератор, Поддержка, Пользователь), модель для
реализации выбрал RBAC и каждой роли назначены нужные права.
Но вот не знаю существует ли модель или реализация для Spring для внедрения следующего
функционала:
Каждый пользователь может создавать свои группы в которые может добавлять пользователей
(Друзья, Коллеги по работе, Семья, и т.д.) добавлять может только тех пользователей
которые зарегистрированы на сайте.
Примерно так это вижу в БД:
+------------+---------+--------------+
| users | groups | users_groups |
+------------+---------+--------------+
| id | id | id |
| username | user_id | group_id |
| passwords | name | user_id |
+------------+---------+--------------+
Теперь о главной задаче
Выдавать права доступа к своей записи другим пользователям:
Доступ по URL (доступен тем у кого есть ссылка)
Публичный доступ (Доступен всем, также виден в поиске)
Публичний с паролем
Группе пользователей
Конкретному зарегистрированному пользователю
Также к каждому шарингу (доступу) будь то пользователю или группе нужно еще выставлять
права:
Только просмотр
Просмотр и редактирование
Полный ( READ / WRITE / DELETE )
Ну и нужно учесть еще такой пункт, к примеру у меня есть записи по работе, создал
группу "Работа" и добавил в нее сотрудников, и группе выдал права на просмотр данной
записи, как быть если я добавляю еще один полный доступ конкретному человеку, но он
также есть в группе для чтения ?
Заранее благодарен за любую помощь или подсказку реализации!
Ответы
Ответ 1
У вас есть таблица записей items. Добавьте в нее поле access_mode и заполняйте такими
значениями
NULL: Только указанные люди
Доступ по URL
Публичный доступ
Публичный с паролем
И заведите таблицу список доступа acl с полями
id
item_id
group_id
is_read
is_write
is_delete
Для добавления конкретного пользователя можно для него создать виртуальную группу
или добавить в таблицу acl поле user_id и заполнять или его или поле group_id (по идее
с виртуальными группами будет проще реализация)
Т.к. у вас есть только разрешительные права и нет запрещающих, то для вычисления
конечных прав пользователя на запись достаточно такого запроса
SELECT
MAX(is_read),
MAX(is_write),
MAX(is_delete)
FROM
acl
WHERE
item_id = :item_id AND
EXISTS (
SELECT
1
FROM
users_groups ug
WHERE
ug.user_id = :user_id AND
ug.group_id = acl.group_id
)