Управление доступом
Выдача ролей пользователю
Роли пользователю могут быть выданы вручную или автоматически, программным кодом, как описано в разделе К данным.
Автоматическая выдача
Для автоматической синхронизации существует метод User_role.sync. Он добавит недостающие роли из указанного списка и уберет не указанные. Также будет добавлена роль BASE_ACCESS, необходимая для любого пользователя, кроме администраторов.
Важно: Этот метод подходит, если у вас только один источник выдачи ролей. На практике роли могут выдаваться из нескольких источников или вручную. При сложной логике следует написать отдельный метод, который будет собирать информацию со всех источников и синхронизировать данные, не затрагивая роли, не относящиеся к этим источникам.
Ручная выдача
Вручную выдать роль пользователю можно через таблицу пользователей, выбрав в контекстном меню пункт «Роли пользователей».
Наложение ролей
Несколько ролей накладываются друг на друга. Пользователь получает доступ к тому, что разрешено хотя бы одной из его ролей, при условии, что это не запрещено ни одной из его ролей.
Настройка роли
Настройки доступа сохраняются в таблице Доступ -> Доступ к операциям. Здесь можно добавить доступ к определенной операции для конкретной роли и указать особые настройки.
Синхронизация списка операций
Список операций находится в таблице Доступ -> Операции класса. Чтобы в списке появились новые классы или методы, необходимо провести синхронизацию (после разработки нового функционала). Это делается в самой таблице через контекстное меню «Refresh list».
Способы управления доступом
В системе есть несколько механизмов, упрощающих настройку:
- Прямое добавление записей в таблицу «Доступ к операциям».
- Необходимо выбрать операцию, роль и установить флаг
is_access. - Можно выдать доступ ко всем операциям класса разом, выбрав операцию
*для этого класса.
- Необходимо выбрать операцию, роль и установить флаг
- Выдача доступа по отказам (через логирование).
- Настройка доступа к меню.
Выдача доступа по отказам
Отказы в доступе логируются в таблице Доступ -> Отказы доступа.
Алгоритм настройки
- В таблице Доступ -> Роли установите флаг «Выставлять доступ» для настраиваемой роли (и снимите его у остальных).
- Создайте тестового пользователя, выдайте ему роль
BASE_ACCESSи настраиваемую роль. - Зайдите под этим пользователем в систему (например, в режиме инкогнито).
- Выполняйте необходимые действия. При получении отказа в таблице «Отказы доступа» появится запись.
- Через контекстное меню «Выдать доступ» в таблице отказов разрешите операцию для текущей настраиваемой роли.
Режим пропуска отказов (Skip No Access)
Чтобы не переключаться между окнами после каждого отказа, можно активировать режим, при котором отказы только логируются, но операция выполняется успешно.
Для активации:
- Добавьте
idпользователя в массив параметраenableSkipNoAccessForUsersв файле конфигурацииconfig/config.json. - Перезапустите основной процесс сервера.
- Массово пройдите по функционалу, а затем массово выдайте доступ по всем зафиксированным отказам.
Доступ к меню
Чтобы выдать доступ к пунктам меню:
- Выберите роль для настройки (флаг «Выставлять доступ» в таблице ролей).
- Перейдите в таблицу System -> Редактор меню.
- Найдите нужные пункты и через контекстное меню выберите «Выдать доступ».
Настройка доступа с наследованием
Если доступ к операции должен ограничиваться конкретными записями (по списку), используются следующие настройки в Access_to_operation:
Иерархический доступ по списку
Для предоставления доступа только к записям, указанным в Списке доступа:
- Установите флаги
is_accessиis_access_by_list. - Чтобы доступ автоматически распространялся на дочерние записи того же класса, добавьте флаг
self_hierarchical.
Наследование доступа на дочерние сущности
Чтобы доступ к родительской сущности (например, Проект) давал доступ к дочерней (например, Изображения проекта), нужно создать запись доступа для дочерней сущности и связать её с родительской:
- Создайте запись доступа для дочерней операции (например,
project_picture.get). - Установите флаги
is_accessиis_access_by_list. - В поле Parent name выберите родительскую операцию (например,
project.get). - В поле parent_foreign_key укажите имя поля в дочерней таблице, которое ссылается на родительскую (например,
project_id).
Если дочерние сущности сами имеют иерархию, для них также можно настроить иерархический доступ.