Поделиться через


Функции, связанные с базами данных, для построителя API данных

Построитель API данных позволяет каждой базе данных иметь собственные функции. В этой статье подробно описаны функции, поддерживаемые для каждой базы данных.

Поддержка версий базы данных

Для многих традиционных баз данных требуется минимальная версия для совместимости с конструктором API данных (DAB).

Минимальная поддерживаемая версия
SQL Server 2016
MySQL 8
PostgreSQL 11

И наоборот, службы облачных баз данных Azure работают с DAB без необходимости в определенной версии.

Минимальная поддерживаемая версия
Azure SQL; Недоступно
Azure Cosmos DB for NoSQL Недоступно
Azure Cosmos DB for PostgreSQL Недоступно

Azure SQL и SQL Server

Существует несколько уникальных свойств SQL, включая Azure SQL и SQL Server.

SESSION_CONTEXT

Azure SQL и SQL Server поддерживают использование SESSION_CONTEXT функции для доступа к удостоверению текущего пользователя. Эта функция полезна, если вы хотите применить встроенную поддержку безопасности на уровне строк (RLS), доступную в Azure SQL и SQL Server.

Для Azure SQL и SQL Server построитель API данных может воспользоваться преимуществами SESSION_CONTEXT для отправки указанных пользователем метаданных в базовую базу данных. Такие метаданные доступны конструктору API данных благодаря утверждениям, присутствующим в маркере доступа. Затем данные, отправляемые в базу данных, можно использовать для настройки дополнительного уровня безопасности (например, путем настройки политик безопасности), чтобы дополнительно предотвратить доступ к данным в таких операциях, как SELECT, UPDATE, DELETE. Данные SESSION_CONTEXT будут доступны для базы данных во время подключения к базе данных, пока это подключение не будет закрыто. Одни и те же данные можно использовать и в хранимой процедуре.

Дополнительные сведения о настройке SESSION_CONTEXT данных см. в разделе sp_set_session_context (Transact-SQL).

Настройте SESSION_CONTEXT с options помощью свойства data-source раздела в файле конфигурации. Дополнительные сведения см. в справочникеdata-source по конфигурации.

{
  ...
  "data-source": {
    "database-type": "mssql",
    "options": {
      "set-session-context": true
    },
    "connection-string": "<connection-string>"
  },
  ...
}

Кроме того, используйте --set-session-context аргумент с командой dab init .

dab init --database-type mssql --set-session-context true

Все утверждения, присутствующие в маркере EasyAuth/JWT, отправляются через SESSION_CONTEXT в базовую базу данных. Все утверждения, присутствующие в маркере, претворяются в пары "ключ-значение", передаваемые с помощью SESSION_CONTEXT запроса. К этим утверждениям относятся, помимо прочего, следующие:

Описание
aud Аудитория
iss Издатель
iat Время выдачи
exp Время окончания срока действия
azp Идентификатор приложения
azpacr Метод проверки подлинности клиента
name Тема
uti Уникальный идентификатор маркера

Дополнительные сведения о утверждениях см. в Microsoft Entra ID справочнике по утверждениям маркеров доступа.

Эти утверждения претворяются в SQL-запрос. В этом усеченном примере показано, как sp_set_session_context используется в этом контексте:

EXEC sp_set_session_context 'aud', '<AudienceID>', @read_only = 1;
EXEC sp_set_session_context 'iss', 'https://login.microsoftonline.com/<TenantID>/v2.0', @read_only = 1;
EXEC sp_set_session_context 'iat', '1637043209', @read_only = 1;
...
EXEC sp_set_session_context 'azp', 'a903e2e6-fd13-4502-8cae-9e09f86b7a6c', @read_only = 1;
EXEC sp_set_session_context 'azpacr', 1, @read_only = 1;
..
EXEC sp_set_session_context 'uti', '_sSP3AwBY0SucuqqJyjEAA', @read_only = 1;
EXEC sp_set_session_context 'ver', '2.0', @read_only = 1;

Затем можно реализовать безопасность на уровне строк (RLS), используя данные сеанса. Дополнительные сведения см. в статье Реализация безопасности на уровне строк с контекстом сеанса.

Azure Cosmos DB

Существует несколько конкретных свойств, которые являются уникальными для различных API в Azure Cosmos DB.

Схема в API для NoSQL

Azure Cosmos DB для NoSQL не зависит от схемы. Чтобы использовать построитель API данных с API для NoSQL, необходимо создать файл схемы GraphQL, включающий определения типов объектов, представляющих модель данных контейнера. Построитель API данных также ожидает, что определения и поля типов объектов GraphQL будут включать директиву authorize схемы GraphQL, если требуется применить более строгий доступ на чтение, чем anonymous.

Например, этот файл схемы представляет Book элемент в контейнере. Этот элемент содержит как минимум title свойства и Authors .

type Book @model(name:"Book"){
  id: ID
  title: String @authorize(roles:["metadataviewer","authenticated"])
  Authors: [Author]
}

Этот пример схемы соответствует следующей конфигурации сущности в файле конфигурации DAB. Дополнительные сведения см. в справочникеentities по конфигурации.

{
  ...
  "Book": {
    "source": "Book",
    "permissions": [
      {
        "role": "anonymous",
        "actions": [ "read" ]
      },
      {
        "role": "metadataviewer",
        "actions": [ "read" ]
      }
    ]
  }
  ...
}

Директива @authorize с roles:["metadataviewer","authenticated"] ограничивает доступ к полю title только пользователям с ролями metadataviewer и authenticated. Для аутентифицированных запрашивающих пользователей системная роль authenticated назначается автоматически, устраняя необходимость в заголовке X-MS-API-ROLE .

Если запрос, прошедший проверку подлинности, должен выполняться в контексте metadataviewer, он должен сопровождаться заголовком запроса типа X-MS-API-ROLE , для которых задано значение metadataviewer. Однако если требуется анонимный доступ, необходимо опустить разрешенную директиву.

Директива @model используется для установления корреляции между этим GraphQL типом объекта и соответствующим именем сущности в конфигурации среды выполнения. Директива имеет следующий формат:@model(name:"<Entity_Name>")

В качестве более глубокого примера директиву @authorize можно применить в определении типа верхнего уровня. Это приложение ограничивает доступ к типу и его полям исключительно ролями, указанными в директиве .

type Series @model(name:"Series") @authorize(roles:["editor","authenticated"]) {
  id: ID
  title: String
  Books: [Book]
}
{
  "Book": {
    "source": "Series",
    "permissions": [
      {
        "role": "authenticated",
        "actions": [ "read" ]
      },
      {
        "role": "editor",
        "actions": [ "*" ]
      }
    ]
  }
}

Межконтейнерные запросы в API для NoSQL

GraphQL операции в контейнерах не поддерживаются. Подсистема отвечает сообщением об ошибке: Adding/updating Relationships is currently not supported in Azure Cosmos DB for NoSQL.

Это ограничение можно обойти, обновив модель данных для хранения сущностей в одном контейнере во внедренном формате. Дополнительные сведения см. в статье Моделирование данных в Azure Cosmos DB для NoSQL.