#веб_программирование #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 )
Комментариев нет:
Отправить комментарий