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