GrantForge

    Архитектура и безопасность

    Модель прав доступа

    Точная семантика ресурсов, выведения выдач, наследования, назначения, правил данных и полей, а также снимков авторизации и версий.

    Эта страница описывает точные правила оценки. Для введения в концепции см. Основные понятия.

    Дерево ресурсов и типы

    Ресурсы принадлежат приложению и организованы в дерево глубиной не более 15 уровней. Тип определяет, куда может быть помещён ресурс:

    Тип Разрешённые родители
    Модуль Верхний уровень, модули
    Меню, страницы Верхний уровень, модули, меню
    Вкладки Страницы, вкладки
    Кнопки Страницы, вкладки
    API, сущности данных Верхний уровень, модули
    Поля Сущности данных

    Ресурсы могут объявлять зависимости друг от друга: «required» (выдача ресурса выдаёт и ресурсы, от которых он зависит) или «optional» (только показывается администраторам и никогда не выдаётся автоматически); циклические зависимости запрещены. Страницы консоли, кнопки и необходимые им API объявляются манифестом прав фронтенда и при запуске сервера синхронизируются как встроенные ресурсы.

    Выведение выдач

    Для учётной записи оценщик сначала определяет её эффективные роли:

    1. Роли, назначенные учётной записи напрямую;
    2. Роли, назначенные группам пользователей и подразделениям учётной записи (включая назначения вышестоящим подразделениям с признаком «включать подчинённые подразделения») и занимаемым ею должностям;
    3. Только назначения, срок действия которых включает текущий момент, и только включённые роли;
    4. Наследование развёртывается: все предки роли (отключённые предки не передают выдачи).

    Затем их выдачи объединяются:

    • Разрешение ресурса подразумевает разрешение самого ресурса, его предков в дереве (чтобы он оставался видимым) и ресурсов, от которых он зависит по «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.

    Редактировать эту страницу на GitHub