Page: unichat API Tree of rights
2019-10-22 13:10
Дерево прав
Дерево прав очень удобно использовать в случае, когда у нас имеется множество сущностей (огранизации, задачи, группы и т.д.), и в этой каждой сущности пользователь может иметь или не иметь каких-либо ограничений.
Для создания правил для различных объектов в чате создадим две таблицы, в первой будут описаны названия правил и их уровень вложенности относительно других правил (дерево прав).
Таблица в базе данных
Используя гем Awesome nested set создадим первую таблицу с иерархией организации - группы - пользователи, со значениями по умолчанию:
Назовем таблицу, например, rules
:
id | name | parent_id | lft | rgt | depth | default |
---|---|---|---|---|---|---|
1 | root | NULL | 1 | 18 | 0 | |
2 | organizations | 1 | 2 | 17 | 1 | |
3 | groups | 2 | 3 | 12 | 2 | |
4 | subscriptions | 3 | 4 | 9 | 3 | |
5 | voice_recognition | 4 | 5 | 6 | 4 | TRUE |
6 | other_rule | 4 | 7 | 8 | 4 | FALSE |
7 | voice_recognition | 3 | 10 | 11 | 3 | TRUE |
8 | org_users | 2 | 13 | 16 | 2 | |
9 | voice_recognition | 8 | 14 | 15 | 3 | TRUE |
По умолчанию для всех объектов чата для правила voice_recocgnition стоит значение TRUE
.
Схематичное отображение прав в отношении объектов
Для наглядности это можно отобразить в виде схемы:
Таблица с с правилами для каждого субъекта
Если нужно изменить какое-либо значение по умолчанию правила для какого либо субъекта мы можем создать таблицу, с использованием полиморфных связей.
Назовем таблицу, например, entity_rules
:
id | entity_type | entity_id | rule_id | value |
---|---|---|---|---|
1 | Organization | 12 | 3 | TRUE |
2 | Group | 2361 | 6 | FALSE |
Затем при проверке мы будем какого-либо правила мы будем ссылаться на таблицу entity_rules
, и если значение не найдено, значит берем дефолтное значение из таблицы rules
.
Плюсы подхода:
- иерархия прав, возможность в любой момент добавить любой уровень вложенности прав, другими словами, можно права разбивать по группам и использование значений по умолчанию для каждой группы/правила;
- изменение правила для любого объекта/группы объектов.
Возможно добавть в систему прав, если необходимо, списка возможных значений для каждого правила. Например, как сейчас устроены права пользователей в группе: RO
/RW
/ADMIN
и др.