Модели политик

Раздел Модели позволяет управлять моделями политик, по которым производится расчет прав доступа.

Модель политик включает в себя зависимые политики библиотеки Casbin. В Системе действуют разрешительная и запретительная модели.

Описание тестирования модели в редакторе Casbin приведено в документе Руководство администратора ЛДМ. ПЛАТФОРМА КОНТЕНТ-СЕРВИСОВ (ЛДМ.ПКС).

Модели политик в интерфейсе Системы

Различные политики объединяет их общая модель. Модели политик заранее заведены в Системе, пользователю нужно только добавить к ним зависимые политики Casbin.

Для этого необходимо выполнить следующие действия:

  1. В разделе Модели открыть нужную модель политик двойным нажатием ЛКМ на ее строку.

    В Системе доступны две модели политик: API (проверка прав на уровне вызова HTTP-запросов) и DATA (проверка прав на уровне конкретных объектов внутри Системы).

    Карточка модели политик содержит общие атрибуты в блоке Общие данные и заполненную модель Casbin в блоке Модель Casbin, недоступные для редактирования.

    img

    Поля блока Модель Casbin в карточке модели API и в карточке модели DATA соответствуют модели в редакторе Casbin. Маппинг полей модели Casbin для API и DATA приведен в документе Руководство администратора ЛДМ. ПЛАТФОРМА КОНТЕНТ-СЕРВИСОВ (ЛДМ.ПКС).

    Блок Изменения включает в себя информацию о последних изменениях, внесенных в текущую модель.

    В блоке Зависимые политики Casbin можно добавить одну или несколько политик доступа, которые после создания будут закреплены за текущей моделью.

  2. В блоке Зависимые политики Casbin нажать кнопку img.

  3. В открывшемся модальном окне заполнить поля.

    img

    В поле Сервис из выпадающего списка нужно выбрать сервис, на который будет распространяться данная политика. Поля Тип политики, Описание, а также параметры в соответствующих полях заполняются вручную.

    Тип политики указывается как «p».

    В поле Параметр 1 необходимо вручную прописать правило для ролей или логинов пользователей, которым в рамках данной политики будет разрешен доступ. Пример заполнения поля: "kd-edit" in (r.sub.roles), которое является условием, при котором роль «Редактор» должна присутствовать в списке его ролей «subject roles». Список ролей пользователя Система получает из токена.

    В поле Параметр 2 требуется указать правило для объекта. Для типа модели DATA правило может включать в себя условия, распространяющиеся, например, на класс объекта, его атрибуты или создателя объекта.

    Для предоставления права на обращение к REST API в данном поле необходимо указать внутренний эндпоинт, по которому будет выполняться запрос. Для предоставления доступа ко всем эндпоинтам сервиса поле Параметр 2 можно заполнить значением «/*».

    В поле Параметр 3 прописать все необходимые действия. Таких действий может быть несколько, они указываются в скобках и разделяются логическим элементом |. Пример заполнения поля для типа модели DATA: «(create)|(update)|(delete)». Для предоставления права на обращение к REST API в данном поле необходимо указать единичный метод (например, «GET») или перечислить методы, разделяя их логическим элементом |. Например, «(POST)|(GET)». Для всех моделей можно использовать значение «.*», которое служит обозначением всех возможных действий или методов. Это подстановочный знак, который позволяет определить общие правила без указания конкретных значений.

    В поле Параметр 4 указать значение «allow» или «deny». Указывая, например, значение «allow», будет действовать разрешительная политика, где запрещено все, кроме того, что было разрешено посредством создания политики. При значении «deny» действует запретительная политика.

    Поле Параметр 5 может содержать значение «true». Поле Параметр 6 заполнять не требуется.

    Создаваемую политику можно сразу активировать, включив тумблер Активно. Политика начинает действовать только после ее активации.

  4. Нажать кнопку [Создать].

Созданная политика доступа появится в блоке Зависимые политики Casbin.

Пример использования политик для роли «Редактор» представлен в таблице.

Пример использования политик для роли «Редактор»

Сервис Пример использования Описание
dh-documents-service p = "kd-edit" in (r.sub.roles), /*, .*, allow Предоставляет роли «Редактор» доступ по слою API ко всем методам сервиса
dh-documents-service p = "kd-edit" in (r.sub.roles), (r.obj.createdBy != r.sub.login) && (r.obj.isPrivateCopy == true), ^publish|update_content|update$, deny Устанавливает для роли «Редактор» полный запрет на доступ к рабочей копии для не автора
dh-documents-service p = "kd-edit" in (r.sub.roles), r.obj.data.kd_attr_userUL_vip == true, .*, deny Устанавливает для роли «Редактор» запрет на работу с VIP-клиентами
dh-documents-service p = "kd-edit" in (r.sub.roles), r.obj.modifiedBy == r.sub.login, unreserved, allow Предоставляет разрешение для роли «Редактор» на снятие резервирования только для того, кто его установил
dh-documents-service p = "kd-edit" in (r.sub.roles), true, create, allow Предоставляет разрешение для роли «Редактор» на создание документа для всех документов
dh-documents-service p = "kd-edit" in (r.sub.roles), r.obj.data.kd_attr_userFL_vip == true, .*, deny Предоставляет запрет для роли «Редактор» на работу клиентами ФЛ VIP
dh-documents-service p = "kd-edit" in (r.sub.roles), r.obj.className == "kd_voc_opf", ^read|update|delete$, allow Предоставляет роли «Редактор» право на работу со справочником «ОПФ»
dh-documents-service p = "kd-edit" in (r.sub.roles), r.obj.className == "kd_classifier", ^read|update|delete$, allow Предоставляет роли «Редактор» право на работу со справочником «Классификатор»
dh-documents-service p = "kd-edit" in (r.sub.roles), r.obj.className == "kd_voc_products", ^read|update|delete$, allow Предоставляет роли «Редактор» право на работу со справочником «Продукты»
dh-documents-service p = "kd-edit" in (r.sub.roles), r.obj.className == "kd_voc_systems", ^read|update|delete$, allow Предоставляет роли «Редактор» право на работу со справочником «Системы-источники»
dh-documents-service p = "kd-edit" in (r.sub.roles), r.obj.className == "kd_voc_kinddeal", ^read|update|delete$, allow Предоставляет роли «Редактор» право на работу со справочником «Виды сделок»
dh-documents-service p = "kd-edit" in (r.sub.roles), r.obj.className == "kd_voc_kindUL", ^read|update|delete$, allow Предоставляет роли «Редактор» право на работу со справочником «Виды ЮЛ»
dh-documents-service p = "kd-edit" in (r.sub.roles), r.obj.className == "kd_voc_kindIP", ^read|update|delete$, allow Предоставляет роли «Редактор» право на работу со справочником «Виды ИП»
dh-documents-service p = "kd-edit" in (r.sub.roles), r.obj.className == "kd_voc_kindFL", ^read|update|delete$, allow Предоставляет роли «Редактор» право на работу со справочником «Виды ФЛ»
dh-documents-service p = "kd-edit" in (r.sub.roles), r.obj.className == "kd_voc_clientstatus", ^read|update|delete$, allow Предоставляет роли «Редактор» право на работу со справочником «Статус клиента»
dh-documents-service p = "kd-edit" in (r.sub.roles), r.obj.className == "kd_voc_dealstate", ^read|update|delete$, allow Предоставляет роли «Редактор» право на работу со справочником «Состояние сделки»
dh-documents-service p = "kd-edit" in (r.sub.roles), r.obj.data.kd_attr_userIP_vip == true, .*, deny Устанавливает запрет для роли «Редактор» на работу с VIP-клиентами ИП
dh-documents-service p = "kd-edit" in (r.sub.roles), r.obj.className == "kd_voc_docstate", ^read|update|delete$, allow Предоставляет роли «Редактор» право на работу со справочником «Состояние документа»
dh-documents-service p = "kd-edit" in (r.sub.roles), r.obj.data.kd_departmentCode == r.sub.attributes.departmentCode, ^read|view_content|download_content|delete|relate|reserve|create_version|update|update_content$, allow Предоставляет роли «Редактор» разрешение на работу с документами и его вложениями в рамках своего департамента
dh-documents-service p = "kd-edit" in (r.sub.roles), r.obj.createdBy == r.sub.login, ^read|view_content|download_content|delete|relate|reserve|create_version|update|update_content$, allow Предоставляет роли «Редактор» разрешение на работу с документами для автора
dh-documents-service p = "kd-edit" in (r.sub.roles), */hard-delete, DELETE, deny Устанавливает запрет для роли «Редактор» на удаление документов из корзины
dh-documents-service p = "kd-edit" in (r.sub.roles), r.obj.data.recordVersion != "-1", relate, allow Устанавливает для роли «Редактор» заглушку для связывания документов по департаменту
dh-facade-service p = " kd-edit" in (r.sub.roles), /*, .*, allow Предоставляет роли «Редактор» доступ по слою API ко всем методам сервиса
dh-facade-service p = " kd-edit" in (r.sub.roles), r.obj.name != -1, .*, allow Предоставляет роли «Редактор» доступ на чтение объектов сервиса
dh-accessrights-service p = " kd-edit" in (r.sub.roles), /*, .*, allow Предоставляет роли «Редактор» доступ по слою API ко всем методам сервиса
dh-files-service p = " kd-edit" in (r.sub.roles), /*, .*, allow Предоставляет роли «Редактор» доступ по слою API ко всем методам сервиса
dh-folders-service p = " kd-edit" in (r.sub.roles), /*, .*, allow Предоставляет роли «Редактор» доступ по слою API ко всем методам сервиса
ldm-preview-service p = " kd-edit" in (r.sub.roles), /*, .*, allow Предоставляет роли «Редактор» доступ по слою API ко всем методам сервиса
dh-collections-service p = "kd-edit" in (r.sub.roles), r.obj.createdBy == r.sub.login, ^delete|update_content$, allow Предоставляет доступ удалять коллекции для роли «Редактор» если пользователь является автором коллекции
dh-collections-service p = "kd-edit" in (r.sub.roles), r.obj.recordVersion != "-1", ^read|view_content$, allow Предоставляет роли «Редактор» право на чтение всех коллекций
dh-collections-service p = " kd-edit" in (r.sub.roles), /*, .*, allow Предоставляет роли «Редактор» доступ по слою API ко всем методам сервиса
dh-collections-service p = " kd-edit" in (r.sub.roles), true, create, allow Предоставляет роли «Редактор» право на создание коллекций
ldm-user-settings-service p = " kd-edit" in (r.sub.roles), /*, .*, allow Предоставляет роли «Редактор» доступ по слою API ко всем методам сервиса
dh-datamodel-service p = " kd-edit" in (r.sub.roles), /*v1/search*, POST, allow Предоставляет роли «Редактор» доступ на чтение классов
dh-datamodel-service p = " kd-edit" in (r.sub.roles), r.obj.rootObjectClass == "DOCUMENT", read, allow Предоставляет роли «Редактор» доступ к классам документов
ldm-packager-objects-service p = " kd-edit" in (r.sub.roles), /*, .*, allow Предоставляет роли «Редактор» доступ по слою API ко всем методам сервиса
dh-relations-service p = " kd-edit" in (r.sub.roles), r.obj.recordVersion != "-1", ^create|read|update$, allow Предоставляет роли «Редактор» право на создание связей между документами
dh-relations-service p = " kd-edit" in (r.sub.roles), /*, .*, allow Предоставляет роли «Редактор» доступ по слою API ко всем методам сервиса

Помимо стандартных политик в Системе существует возможность настройки доступа к ACL-объектам. Такая политика предоставляет доступ ко всем ACL-объектам с соответствующими правами и может выглядеть следующим образом: p = true, checkAcl(r.obj.acl\, r.sub\, r.act), allow.

Впоследствии при получении запроса в рамках созданной политики каждый раз будет проводиться автоматическая проверка на соответствие указанных параметров.

Для корректной авторизации пользователя в Системе в первую очередь требуются политики по слою API для сервисов «Права доступа» и «Настройки пользователя»: p = "user" in (r.sub.roles), /*, allow с указанием сервиса в форме создания. После этого аналогичным образом необходимо создать политики по слою API для других сервисов, в которых планируются работы.

Также обязательным действием в рамках работы с политиками является предоставление API прав на получение списка существующих ролей всем пользователям. Для этого рекомендуется завести в Keycloak общую для пользователей роль или группу, после чего в сервисе «Права доступа» настроить политику для запроса «POST /dh-accessrights-service/api/v1/dha/access/roles».

Если требуется удалить политики из модели политик, необходимо в блоке Зависимые политики Casbin отметить чекбоксами нужные политики, нажать кнопку img и подтвердить действие в открывшемся окне.

img

Изменение модели политик

Для изменения в карточке модели политик доступен только блок Зависимые политики Casbin. Для этого необходимо выполнить следующие действия:

  1. В разделе Модели открыть необходимую модель двойным нажатием ЛКМ на ее строку.
  2. В открывшейся карточке в блоке Зависимые политики Casbin в рамках изменений добавить новую политику, отредактировать или удалить существующую.

    img

    Чтобы добавить новую политику, необходимо нажать кнопку img. Чтобы отредактировать существующую, нужно открыть ее двойным нажатием ЛКМ и в открывшейся карточке внести изменения в поля (п. Изменение и удаление политики доступа). Чтобы удалить, необходимо отметить чекбоксами одну или несколько политик, после чего нажать кнопку img на панели инструментов блока Зависимые политики Casbin.

  3. После внесения изменений в модель политик нажать кнопку img.

Внесенные изменения будут сохранены, карточка модели политик автоматически обновится. Появится уведомление, информирующее об успешном обновлении модели политик.