Partager via


Fonctionnalités spécifiques à la base de données pour le générateur d’API de données

Le générateur d’API de données permet à chaque base de données d’avoir ses propres fonctionnalités spécifiques. Cet article détaille les fonctionnalités prises en charge pour chaque base de données.

Prise en charge des versions de base de données

De nombreuses bases de données traditionnelles nécessitent une version minimale pour être compatible avec le Générateur d’API de données (DAB).

Version minimale prise en charge
SQL Server 2016
MySQL 8
PostgreSQL 11

À l’inverse, les services de base de données cloud Azure fonctionnent avec DAB prêtes à l’emploi sans nécessiter une version spécifique.

Version minimale prise en charge
Azure SQL n/a
Azure Cosmos DB pour NoSQL n/a
Azure Cosmos DB pour PostgreSQL n/a

Azure SQL et SQL Server

Il existe quelques propriétés spécifiques propres à SQL, notamment Azure SQL et SQL Server.

SESSION_CONTEXT

Azure SQL et SQL Server prennent en charge l’utilisation de la SESSION_CONTEXT fonction pour accéder à l’identité de l’utilisateur actuel. Cette fonctionnalité est utile lorsque vous souhaitez appliquer la prise en charge native de la sécurité au niveau des lignes (RLS) disponible dans Azure SQL et SQL Server.

Par Azure SQL et SQL Server, le Générateur d’API de données peut en tirer parti pour envoyer des SESSION_CONTEXT métadonnées spécifiées par l’utilisateur à la base de données sous-jacente. Ces métadonnées sont disponibles pour le générateur d’API de données en vertu des revendications présentes dans le jeton d’accès. Les données envoyées à la base de données peuvent ensuite être utilisées pour configurer un niveau de sécurité supplémentaire (par exemple, en configurant des stratégies de sécurité) afin d’empêcher davantage l’accès aux données dans des opérations telles que SELECT, UPDATE, DELETE. Les SESSION_CONTEXT données sont disponibles pour la base de données pendant la connexion à la base de données jusqu’à ce que cette connexion soit fermée. Les mêmes données peuvent également être utilisées à l’intérieur d’une procédure stockée.

Pour plus d’informations sur la définition des SESSION_CONTEXT données, consultez sp_set_session_context (Transact-SQL).

Configurez SESSION_CONTEXT à l’aide de la options propriété de la data-source section dans le fichier de configuration. Pour plus d’informations, consultez data-source informations de référence sur la configuration.

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

Vous pouvez également utiliser l’argument --set-session-context avec la dab init commande .

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

Toutes les revendications présentes dans le jeton EasyAuth/JWT sont envoyées via la SESSION_CONTEXT base de données sous-jacente. Toutes les revendications présentes dans le jeton sont traduites en paires clé-valeur transmises via SESSION_CONTEXT une requête. Ces revendications incluent, mais ne sont pas limitées à :

Description
aud Public visé
iss Émetteur
iat Émis à
exp Heure d’expiration
azp Identificateur d’application
azpacr Méthode d’authentification du client
name Objet
uti Identificateur de jeton unique

Pour plus d’informations sur les revendications, consultez Microsoft Entra ID référence sur les revendications de jeton d’accès.

Ces revendications sont traduites en requête SQL. Cet exemple tronqué illustre comment sp_set_session_context est utilisé dans ce contexte :

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;

Vous pouvez ensuite implémenter la sécurité au niveau des lignes (RLS) à l’aide des données de session. Pour plus d’informations, consultez Implémenter la sécurité au niveau des lignes avec le contexte de session.

Azure Cosmos DB

Il existe quelques propriétés spécifiques qui sont propres à différentes API dans Azure Cosmos DB.

Schéma dans l’API pour NoSQL

La solution Azure Cosmos DB for NoSQL est indépendante du schéma. Pour utiliser le générateur d’API de données avec l’API pour NoSQL, vous devez créer un fichier de schéma GraphQL qui inclut les définitions de type d’objet représentant le modèle de données de votre conteneur. Le générateur d’API de données s’attend également à ce que vos GraphQL définitions et champs de type d’objet incluent la directive authorize de schéma GraphQL lorsque vous souhaitez appliquer un accès en lecture plus restrictif que anonymous.

Par exemple, ce fichier de schéma représente un Book élément dans un conteneur. Cet élément contient, au minimum, title et Authors des propriétés.

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

Cet exemple de schéma correspond à la configuration d’entité suivante dans le fichier de configuration DAB. Pour plus d’informations, consultez entities informations de référence sur la configuration.

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

La @authorize directive avec roles:["metadataviewer","authenticated"] limite l’accès au title champ aux utilisateurs disposant des rôles metadataviewer et authenticated. Pour les demandeurs authentifiés, le rôle authenticated système est automatiquement attribué, ce qui élimine le besoin d’un X-MS-API-ROLE en-tête.

Si la demande authentifiée doit être exécutée dans le contexte de metadataviewer, elle doit être accompagnée d’un en-tête de requête de type X-MS-API-ROLE défini sur metadataviewer. Toutefois, si l’accès anonyme est souhaité, vous devez omettre la directive autorisée.

La @model directive est utilisée pour établir une corrélation entre ce type d’objet GraphQL et le nom d’entité correspondant dans la configuration du runtime. La directive est mise en forme comme suit :@model(name:"<Entity_Name>")

Par exemple, la @authorize directive peut être appliquée à la définition de type de niveau supérieur. Cette application limite l’accès au type et à ses champs exclusivement aux rôles spécifiés dans la directive.

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

Requêtes inter-conteneurs dans l’API pour NoSQL

GraphQL opérations entre les conteneurs ne sont pas prises en charge. Le moteur répond avec un message d’erreur indiquant : Adding/updating Relationships is currently not supported in Azure Cosmos DB for NoSQL.

Vous pouvez contourner cette limitation en mettant à jour votre modèle de données pour stocker des entités dans le même conteneur dans un format incorporé. Pour plus d’informations, consultez Modélisation des données dans Azure Cosmos DB for NoSQL.