Модели политик¶
Раздел Модели позволяет управлять моделями политик, по которым производится расчет прав доступа.
Модель политик включает в себя зависимые политики библиотеки Casbin. В Системе действуют разрешительная и запретительная модели.
Описание тестирования модели в редакторе Casbin приведено в документе Руководство администратора ЛДМ. ПЛАТФОРМА КОНТЕНТ-СЕРВИСОВ (ЛДМ.ПКС).
Модели политик в интерфейсе Системы¶
Различные политики объединяет их общая модель. Модели политик заранее заведены в Системе, пользователю нужно только добавить к ним зависимые политики Casbin.
Для этого необходимо выполнить следующие действия:
-
В разделе Модели открыть нужную модель политик двойным нажатием ЛКМ на ее строку.
В Системе доступны две модели политик: API (проверка прав на уровне вызова HTTP-запросов) и DATA (проверка прав на уровне конкретных объектов внутри Системы).
Карточка модели политик содержит общие атрибуты в блоке Общие данные и заполненную модель Casbin в блоке Модель Casbin, недоступные для редактирования.
Поля блока Модель Casbin в карточке модели API и в карточке модели DATA соответствуют модели в редакторе Casbin. Маппинг полей модели Casbin для API и DATA приведен в документе Руководство администратора ЛДМ. ПЛАТФОРМА КОНТЕНТ-СЕРВИСОВ (ЛДМ.ПКС).
Блок Изменения включает в себя информацию о последних изменениях, внесенных в текущую модель.
В блоке Зависимые политики Casbin можно добавить одну или несколько политик доступа, которые после создания будут закреплены за текущей моделью.
-
В открывшемся модальном окне заполнить поля.
В поле Сервис из выпадающего списка нужно выбрать сервис, на который будет распространяться данная политика. Поля Тип политики, Описание, а также параметры в соответствующих полях заполняются вручную.
Тип политики указывается как «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 заполнять не требуется.
Создаваемую политику можно сразу активировать, включив тумблер Активно. Политика начинает действовать только после ее активации.
-
Нажать кнопку [Создать].
Созданная политика доступа появится в блоке Зависимые политики 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 отметить чекбоксами нужные политики, нажать кнопку
и подтвердить действие в открывшемся окне.
Изменение модели политик¶
Для изменения в карточке модели политик доступен только блок Зависимые политики Casbin. Для этого необходимо выполнить следующие действия:
- В разделе Модели открыть необходимую модель двойным нажатием ЛКМ на ее строку.
-
В открывшейся карточке в блоке Зависимые политики Casbin в рамках изменений добавить новую политику, отредактировать или удалить существующую.
Чтобы добавить новую политику, необходимо нажать кнопку
. Чтобы отредактировать существующую, нужно открыть ее двойным нажатием ЛКМ и в открывшейся карточке внести изменения в поля (п. Изменение и удаление политики доступа). Чтобы удалить, необходимо отметить чекбоксами одну или несколько политик, после чего нажать кнопку
на панели инструментов блока Зависимые политики Casbin.
Внесенные изменения будут сохранены, карточка модели политик автоматически обновится. Появится уведомление, информирующее об успешном обновлении модели политик.




