Наследование ролей в построителе API данных

Замечание

Функции построителя данных 2.0, описанные в этом разделе, находятся в предварительной версии и могут измениться до общедоступной доступности. Дополнительные сведения см. в статье "Новые возможности" версии 2.0.

Наследование ролей позволяет единожды задать разрешения для более широкой роли, чтобы более узкие роли автоматически унаследовали этот доступ. Без наследования ролей необходимо повторять один и тот же блок разрешений для каждой роли и каждой сущности. С наследованием ролей настройте доступ на anonymous один раз, и все расширенные роли получат такой же доступ.

Цепочка наследования

Цепочка наследования передается из наименее привилегированных к наиболее привилегированным:

named-role → authenticated → anonymous
Роль Наследует от Примечания
Именованная роль (например, editor) authenticated Или, anonymous если authenticated не настроено
authenticated anonymous Применяется, если явный authenticated блок не существует
anonymous (нет) Основа цепочки; нет запасного варианта

Цепочка означает:

  • Если у именованной роли нет блока разрешений, DAB ищет authenticated блок. Если ни один из них не существует, он возвращается в anonymous.
  • Если у authenticated нет блока разрешений, DAB использует блок anonymous.
  • Если у anonymous нет блока разрешений, запрос отклоняется с 403 Forbidden.

Как решается наследование

Когда DAB оценивает запрос, он определяет эффективную роль, а затем проходит цепочку наследования, чтобы найти блок разрешений:

  1. DAB определяет эффективную роль из запроса (через X-MS-API-ROLE заголовок, претензии токена или значения по умолчанию).
  2. DAB ищет явный блок разрешений в entities.<name>.permissions, соответствующий эффективной роли.
  3. Если соответствующий блок отсутствует, DAB проходит по цепочке: authenticatedanonymous.
  4. Первый найденный блок сопоставления предоставляет разрешения для запроса.
  5. Если ни один блок не соответствует какой-либо роли в цепочке, DAB возвращает 403 Forbidden.

Замечание

DAB оценивает разрешения в контексте ровно одной эффективной роли на запрос. Наследование ролей не объединяет разрешения из нескольких ролей.

Примеры

Минимальная конфигурация: одно разрешение для всех ролей

read Определение разрешения на anonymous. Каждая роль —authenticated и любая именованная роль — наследуют этот доступ.

{
  "entities": {
    "Book": {
      "source": "dbo.books",
      "permissions": [
        { "role": "anonymous", "actions": [ "read" ] }
      ]
    }
  }
}

Действующие разрешения для этой конфигурации:

Entity: Book
    Role: anonymous        | Actions: Read
    Role: authenticated    | Actions: Read (inherited from: anonymous)
    Unconfigured roles     | Inherit from: anonymous

Многоуровневая конфигурация: другой доступ для каждой роли

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

{
  "entities": {
    "Order": {
      "source": "dbo.orders",
      "permissions": [
        { "role": "anonymous",      "actions": [ "read" ] },
        { "role": "authenticated",  "actions": [ "read", "create" ] },
        { "role": "admin",          "actions": [ "*" ] }
      ]
    }
  }
}

Действующие разрешения для этой конфигурации:

Entity: Order
    Role: anonymous        | Actions: Read
    Role: authenticated    | Actions: Read, Create
    Role: admin            | Actions: Create, Read, Update, Delete
    Unconfigured roles     | Inherit from: authenticated

Любая именованная роль, отличная от admin — например, viewer или support — наследует от authenticated и получает read и create доступ.

Нет наследования: полностью заблокировано

Если anonymous нет блока разрешений и нет другой роли в цепочке, каждый запрос к этой сущности отклоняется.

{
  "entities": {
    "AuditLog": {
      "source": "dbo.audit_log",
      "permissions": [
        { "role": "admin", "actions": [ "read" ] }
      ]
    }
  }
}

Только admin может получить доступ к AuditLog в этой конфигурации. authenticated и anonymous не имеют блока для наследования, поэтому DAB отклоняет запросы от этих ролей с 403 Forbidden.

Это важно

DAB выдает предупреждение при запуске, когда authenticated или именованные роли настроены на сущности, но поставщик Unauthenticated активен. Если Unauthenticated этот параметр активен, эти роли никогда не активируются. Дополнительные сведения см. в разделе "Настройка неавторентированного поставщика".

Просмотр эффективных разрешений

Используйте dab configure --show-effective-permissions для отображения разрешений для каждой сущности, включая информацию о том, какие роли откуда унаследованы. Эта команда является самым быстрым способом удостовериться в том, что наследование работает как предусмотрено, без запуска движка.

dab configure --show-effective-permissions

Вы также можете выбрать конкретный файл конфигурации:

dab configure --show-effective-permissions --config my-config.json

Пример выходных данных:

Entity: Book
    Role: anonymous        | Actions: Read
    Role: authenticated    | Actions: Read (inherited from: anonymous)
    Unconfigured roles inherit from: anonymous

Entity: Order
    Role: admin            | Actions: Create, Read, Update, Delete
    Role: anonymous        | Actions: Read
    Role: authenticated    | Actions: Read (inherited from: anonymous)
    Unconfigured roles inherit from: authenticated

Полные параметры см. в разделе --show-effective-permissions.

Наследование и явные разрешения

Сценарий Recommendation
Все роли должны иметь одинаковый доступ Определить один раз anonymous; разрешить всем ролям наследоваться
Для пользователей, прошедших проверку подлинности, требуется больше доступа, чем анонимный Определить anonymous чтение, добавление и authenticated создание/обновление
Для именованной роли требуется более широкий доступ, чем authenticated Ясно определите именованную роль; остальные наследуют от authenticated
Именованной роли требуется меньше доступа, чем authenticated Явно определить именованную роль с сокращением действий.
Сущность должна быть полностью частной Предоставьте только определенную именованную роль, оставьте authenticated и anonymous неопределённые.