Страницы

Поиск по вопросам

среда, 22 января 2020 г.

Как правильно реализовать функциональность “Поделиться” на подобии как в Google Drive?

#веб_программирование #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 )

Комментариев нет:

Отправить комментарий