Эта страница описывает точные правила оценки. Для введения в концепции см. Основные понятия.
Дерево ресурсов и типы
Ресурсы принадлежат приложению и организованы в дерево глубиной не более 15 уровней. Тип определяет, куда может быть помещён ресурс:
| Тип | Разрешённые родители |
|---|---|
| Модуль | Верхний уровень, модули |
| Меню, страницы | Верхний уровень, модули, меню |
| Вкладки | Страницы, вкладки |
| Кнопки | Страницы, вкладки |
| API, сущности данных | Верхний уровень, модули |
| Поля | Сущности данных |
Ресурсы могут объявлять зависимости друг от друга: «required» (выдача ресурса выдаёт и ресурсы, от которых он зависит) или «optional» (только показывается администраторам и никогда не выдаётся автоматически); циклические зависимости запрещены. Страницы консоли, кнопки и необходимые им API объявляются манифестом прав фронтенда и при запуске сервера синхронизируются как встроенные ресурсы.
Выведение выдач
Для учётной записи оценщик сначала определяет её эффективные роли:
- Роли, назначенные учётной записи напрямую;
- Роли, назначенные группам пользователей и подразделениям учётной записи (включая назначения вышестоящим подразделениям с признаком «включать подчинённые подразделения») и занимаемым ею должностям;
- Только назначения, срок действия которых включает текущий момент, и только включённые роли;
- Наследование развёртывается: все предки роли (отключённые предки не передают выдачи).
Затем их выдачи объединяются:
- Разрешение ресурса подразумевает разрешение самого ресурса, его предков в дереве (чтобы он оставался видимым) и ресурсов, от которых он зависит по «required» (рекурсивно).
- Запрет ресурса действует на него и всех его потомков и имеет приоритет над любым разрешением.
- Отключённые ресурсы и их потомки не действуют.
- Системные роли эквиваленты разрешению всего поддерева своего модуля (например,
system,data,platform).
Результат — множество доступных ресурсов, а также коды прав тех из них, что являются ресурсами API.
Защита от эскалации привилегий
- Чтобы выдать «allow», выдающий сам должен уметь пользоваться этим ресурсом (владельцы системных ролей освобождены от этого для бизнес-приложений).
- При назначении роли или настройке наследования выдающий сам должен покрывать каждый ресурс, который покрывает роль, в каждом приложении.
- Роль администратора платформы может быть назначена, изменена или отозвана только её текущими владельцами.
- «Deny» не ограничивается: любой, у кого есть права на выдачу, может ужесточать права.
Правила данных
Политики данных принадлежат ролям и задают области по схеме «сущность × действие × эффект»: ALL (только платформенный тенант), TENANT, ORG_AND_CHILDREN, ORG, CUSTOM_ORGS, SELF, CONDITION. Строка доступна тогда и только тогда, когда она удовлетворяет хотя бы одному правилу allow и ни одному правилу deny.
Условия — структурированный JSON; они никогда не выполняются и проверяются перед сохранением:
{ "and": [
{ "field": "status", "op": "eq", "value": "ACTIVE" },
{ "not": { "field": "orgUnitId", "op": "in", "value": { "var": "subject.orgUnitIds" } } }
] }Допустимы только переменные subject.id, subject.username, subject.orgUnitIds, subject.groupCodes, subject.positionCodes и now; операторы ограничены типом поля; вложенность ограничена 5 уровнями и 50 узлами. Сервер транслирует правила в JPA Specification, а SDK транслируют их с той же семантикой внутри бизнес-приложений.
Правила полей
Политики полей определяют, как поле можно читать (видимое, маскированное, скрытое) и записывать (редактируемое, только для чтения); при нескольких ролях действует самая разрешающая настройка, а поле без настроек открыто полностью. Правила чтения применяются при сериализации JSON (один и тот же DTO отображается по-разному для разных людей), правила записи — в сервисном слое, а изменение поля «только для чтения» возвращает GF-FIELD-001 с указанием поля.
Снимки и версии
Результат оценки — снимок авторизации: доступные ресурсы, коды прав, правила данных и правила полей. Снимки кэшируются для каждой учётной записи; любое изменение выдач, назначений, наследования, каталога ресурсов, политик или членств увеличивает версию затронутой области (каталога или тенанта) и инвалидирует кэш. Каждая конечная точка, требующая прав, возвращает текущую версию в заголовке ответа X-Authorization-Version — консоль использует её, чтобы решить, перезагружать ли меню; Open API выражает ту же версию с помощью ETag.
