Роли безопасности позволяют ограничивать доступ к данным для разных групп пользователей. Каждая роль описывает сущности и поля, к которым разрешён доступ согласно заданным ограничениям.
Внутри 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_table
admin.role_form
со списком родительских ролей, списком юзеров и списком ограничений на сущности для этой ролиadmin.role_entity_form
с ограничениями на действия над записью и списком ограничений на поля сущностиadmin.generate_role_template
позволяет сгенерировать шаблон роли с дефолтными значениями для выбранных схем или отдельных сущностей