Partilhar via


Funcionalidades específicas da base de dados para o Construtor de API de Dados

O construtor de API de Dados permite que cada base de dados tenha as suas próprias funcionalidades específicas. Este artigo detalha as funcionalidades suportadas para cada base de dados.

Suporte da versão da base de dados

Muitas bases de dados tradicionais requerem uma versão mínima para serem compatíveis com o Construtor de API de Dados (DAB).

Versão Mínima Suportada
SQL Server 2016
MySQL 8
PostgreSQL 11

Por outro lado, os serviços de base de dados cloud do Azure funcionam com o DAB fora da caixa sem necessidade de uma versão específica.

Versão Mínima Suportada
SQL do Azure n/a
Azure Cosmos DB para NoSQL n/a
Azure Cosmos DB para PostgreSQL n/a

SQL do Azure e SQL Server

Existem algumas propriedades específicas que são exclusivas do SQL, incluindo SQL do Azure e SQL Server.

SESSION_CONTEXT

SQL do Azure e SQL Server suportam a utilização da SESSION_CONTEXT função para aceder à identidade do utilizador atual. Esta funcionalidade é útil quando pretende aplicar o suporte nativo para segurança ao nível da linha (RLS) disponível no SQL do Azure e SQL Server.

Para SQL do Azure e SQL Server, o Construtor de API de Dados pode tirar partido do SESSION_CONTEXT para enviar metadados especificados pelo utilizador para a base de dados subjacente. Esses metadados estão disponíveis para o construtor de API de Dados em virtude das afirmações presentes no token de acesso. Os dados enviados para a base de dados podem ser utilizados para configurar um nível adicional de segurança (por exemplo, ao configurar políticas de segurança) para impedir ainda mais o acesso a dados em operações como SELECT, UPDATE, DELETE. Os SESSION_CONTEXT dados estão disponíveis para a base de dados durante a ligação da base de dados até que essa ligação seja fechada. Os mesmos dados também podem ser utilizados dentro de um procedimento armazenado.

Para obter mais informações sobre a definição SESSION_CONTEXT de dados, veja sp_set_session_context (Transact-SQL).

Configure SESSION_CONTEXT com a options propriedade da data-source secção no ficheiro de configuração. Para obter mais informações, veja data-source Referência de configuração.

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

Em alternativa, utilize o --set-session-context argumento com o dab init comando .

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

Todas as afirmações presentes no token EasyAuth/JWT são enviadas através da SESSION_CONTEXT para a base de dados subjacente. Todas as afirmações presentes no token são traduzidas em pares chave-valor transmitidos através SESSION_CONTEXT da consulta. Estas afirmações incluem, mas não se limitam a:

Description
aud Audiência
iss Emissor
iat Emitido em
exp Hora de expiração
azp Identificador da aplicação
azpacr Método de autenticação do cliente
name Assunto
uti Identificador de token exclusivo

Para obter mais informações sobre afirmações, veja Microsoft Entra ID referência de afirmações de tokens de acesso.

Estas afirmações são traduzidas numa consulta SQL. Este exemplo truncado ilustra como sp_set_session_context é utilizado neste contexto:

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;

Em seguida, pode implementar a segurança ao nível da linha (RLS) com os dados de sessão. Para obter mais informações, veja Implementar a segurança ao nível da linha com o contexto de sessão.

Azure Cosmos DB

Existem algumas propriedades específicas que são exclusivas de várias APIs no Azure Cosmos DB.

Esquema na API para NoSQL

O Azure Cosmos DB para NoSQL é agnóstico ao esquema. Para utilizar o Construtor de API de Dados com a API para NoSQL, tem de criar um ficheiro de esquema GraphQL que inclua as definições de tipo de objeto que representam o modelo de dados do contentor. O construtor de API de Dados também espera que as definições e os campos do tipo de objeto GraphQL incluam a diretiva authorize de esquema do GraphQL quando pretender impor um acesso de leitura mais restritivo do que anonymous.

Por exemplo, este ficheiro de esquema representa um Book item dentro de um contentor. Este item contém, no mínimo, title e Authors propriedades.

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

Este esquema de exemplo corresponde à seguinte configuração de entidade no ficheiro de configuração da DAB. Para obter mais informações, veja entities Referência de configuração.

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

A @authorize diretiva com roles:["metadataviewer","authenticated"] restringe o title acesso ao campo apenas a utilizadores com as funções metadataviewer e authenticated. Para os requerentes autenticados, a função de sistema authenticated é atribuída automaticamente, eliminando a necessidade de um X-MS-API-ROLE cabeçalho.

Se o pedido autenticado precisar de ser executado no contexto de metadataviewer, deve ser acompanhado com um cabeçalho de pedido do tipo X-MS-API-ROLE definido como metadataviewer. No entanto, se o acesso anónimo for pretendido, tem de omitir a diretiva autorizada.

A @model diretiva é utilizada para estabelecer uma correlação entre este tipo de objeto GraphQL e o nome da entidade correspondente na configuração do runtime. A diretiva está formatada como: @model(name:"<Entity_Name>")

Como exemplo mais aprofundado, a @authorize diretiva pode ser aplicada na definição de tipo de nível superior. Esta aplicação restringe o acesso ao tipo e aos respetivos campos exclusivamente às funções especificadas na diretiva.

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": [ "*" ]
      }
    ]
  }
}

Consultas entre contentores na API para NoSQL

As operações do GraphQL em contentores não são suportadas. O motor responde com uma mensagem de erro a indicar: Adding/updating Relationships is currently not supported in Azure Cosmos DB for NoSQL.

Pode contornar esta limitação ao atualizar o modelo de dados para armazenar entidades no mesmo contentor num formato incorporado. Para obter mais informações, veja Modelação de dados no Azure Cosmos DB para NoSQL.