Роли безопасности позволяют ограничивать доступ к данным для разных групп пользователей. Каждая роль описывает сущности и поля, к которым разрешён доступ согласно заданным ограничениям.
Внутри ozma.io ограничения реализуются путем добавления к запросу пользователя условий в блок WHERE.
Роль создается в таблице public.roles.
| Колонка | Описание |
|---|---|
schema_id |
Схема, к которой привязана данная роль. |
name |
Название роли. Может быть произвольным, но советуем придерживаться названий на латинице, начинающихся с букв. |
allow_broken |
Флаг, позволяющий сохранить неработающую роль |
Роли могут наследоваться от других ролей -- унаследованные разрешения суммируются.
Каждая роль обязательно должна наследоваться от funapp.observer - системной роли, которая даёт пользователю доступы к таблицам, необходимым для работы с интерфейсом ozma.io
Таблица public.role_entities cодержит ограничения, заданные для заданной роли и сущности.
select), вставки (insert), изменения (update), проверок на допустимость изменений (check) и удаления (delete) с этой сущностью.true.| Колонка | Описание |
|---|---|
role_id |
Роль, для которой определяется ограничение. |
entity_id |
Сущность, для которой определяется ограничение. |
insert |
Разрешение на вставку записей. |
select |
Ограничение на SELECT в виде выражения на языке FunQL. |
update |
Ограничение на UPDATE в виде выражения на языке FunQL. Дополнительно накладываются ограничения из select для сущности и затрагиваемых полей. |
check |
Проверка на допустимость изменений пользователя. Проводится после запросов INSERT и UPDATE. Требуется для INSERT и UPDATE. |
delete |
Ограничение на DELETE в виде выражения на языке FunQL. Дополнительно накладываются ограничения из select для сущности и всех её полей. |
Менеджер (роль) ведет в системе Задачи (сущность). Необходимо, чтобы менеджер видел только свои задачи и задачи своего отдела, мог добавлять и редактировать только свои задачи и не имел доступа к удалению.
| Поле | Значение | Пояснение |
|---|---|---|
| role_id | user.manager |
Роль пользователя |
| entity_id | pm.tasks |
Сущность, к которой задаются доступы |
| select | responsible = ANY((SELECT id FROM base.people WHERE department = (SELECT department FROM base.people WHERE user = $$user_id LIMIT 1))) |
Пользователь с ролью user.manager видит только те записи pm.tasks, в которых ответственный имеет тот же отдел, что и пользователь. $$user_id - уникальный id пользователя из таблицы public.users |
| insert | responsible = (SELECT id FROM base.people WHERE user = $$user_id LIMIT 1) |
Пользователь с ролью user.manager может добавлять новые задачи (pm.tasks), только если в создаваемой записи он установлен ответственным |
| update | responsible = (SELECT id FROM base.people WHERE user = $$user_id LIMIT 1) |
Пользователь с ролью user.manager может редактировать задачи (pm.tasks), только если в редактируемой записи он установлен ответственным |
| check | true |
Пользователь с ролью user.manager может менять записи pm.tasks |
| delete | false |
Полный запрет удаления записей pm.tasks для пользователей с ролью user.manager |
Для сущностей в одной иерархии доступы складываются как "И" от корня иерархии.
К примеру, есть иерархия сущностей - Организации и Люди внутри Контактов. Заданы ограничения для трех этих сущностей:
| Сущность | Родительская сущность | Ограничение |
|---|---|---|
base.contacts |
null | (c) |
base.people |
base.contacts |
(p) |
base.organizations |
base.contacts |
(o) |
Тогда при выборке из сущностей органичения будут выглядеть так:
| Выборка | Ограничение |
|---|---|
SELECT ... FROM base.contacts |
WHERE (c) AND ((sub_entity INHERITED FROM people AND (p)) OR (sub_entity INHERITED FROM organizations AND (o))) |
SELECT ... FROM base.people |
WHERE (c) AND (p) |
SELECT ... FROM base.organizations |
WHERE (c) AND (p) |
Таблица public.role_column_fields cодержит ограничения, заданные для данной роли и поля сущности.
select), вставки (insert), изменения (update) и проверок на допустимость изменений (check).true.| Колонка | Описание |
|---|---|
role_entity_id |
Ограничение на сущность, для которого определяется ограничение на поле. |
column_name |
Поле, для которого определяется ограничение. |
select |
Ограничение на SELECT в виде выражения на языке FunQL. |
insert |
Разрешение на вставку записей. |
update |
Ограничение на UPDATE поля в виде выражения на языке FunQL. |
check |
Проверка на допустимость изменений пользователя. Проводится после запросов INSERT и UPDATE. Требуется для INSERT и UPDATE. |
Если пользователю не доступно для чтения какое-либо поле, указанное в юзервью, то всё юзервью будет недоступно для этого пользователя.
В будущем мы планируем добавить возможность показывать данные, доступа к которым у пользователя нет с заменой текста, чисел, дат на звездочки (****).
Это позволит пользователю видеть структуру данных, но не видеть сами данные. А также сократит время на конфигурацию и отладку пользовательских представлений администратору решения.
Менеджер (роль) ведет в системе Задачи (сущность). Запретить доступ к редактированию поля "Оценка руководителя" для любых задач, а также запретить чтение этого поля для задач, которые ведут люди из отдела пользователя
| Колонка | Значение | |
|---|---|---|
| role_entity_id | user.manager.pm.tasks |
Сущность, для которой определяется ограничение |
| column_name | assessment |
Поле "Оценка руководителя", для которого определяется ограничение |
| select | responsible = (SELECT id FROM base.people WHERE user = $$user_id LIMIT 1) |
Пользователь видит поле "Оценка руководителя" только в том случае, если он стоит в поле "Ответственный" |
| insert | false |
Пользователь не может заполнять поле "Оценка руководителя" при вставке новой записи |
| update | false |
Пользователь не может менять значение поля "Оценка руководителя" |
| check | false |
Пользователь не может менять значение поля "Оценка руководителя" |
admin для настройки ролейВ admin-схеме есть набор представлений, для настройки ролей, а также процедура, позволяющая сгенерировать шаблон роли.
admin.roles_tableadmin.role_form со списком родительских ролей, списком юзеров и списком ограничений на сущности для этой ролиadmin.role_entity_form с ограничениями на действия над записью и списком ограничений на поля сущностиadmin.generate_role_template позволяет сгенерировать шаблон роли с дефолтными значениями для выбранных схем или отдельных сущностей