Дерево прав

Дерево прав очень удобно использовать в случае, когда у нас имеется множество сущностей (огранизации, задачи, группы и т.д.), и в этой каждой сущности пользователь может иметь или не иметь каких-либо ограничений.

Для создания правил для различных объектов в чате создадим две таблицы, в первой будут описаны названия правил и их уровень вложенности относительно других правил (дерево прав).

Таблица в базе данных

Используя гем 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 и др.