Microsoft SQL Server
Sécurité au niveau des lignes
Recherche…
Prédicat de filtre RLS
La base de données SQL Server 2016+ et Azure Sql vous permet de filtrer automatiquement les lignes renvoyées dans l'instruction select à l'aide d'un prédicat. Cette fonctionnalité est appelée sécurité au niveau de la ligne .
Tout d'abord, vous avez besoin d'une fonction table contenant un prédicat décrivant la condition qui permettra aux utilisateurs de lire les données d'une table:
DROP FUNCTION IF EXISTS dbo.pUserCanAccessCompany
GO
CREATE FUNCTION
dbo.pUserCanAccessCompany(@CompanyID int)
RETURNS TABLE
WITH SCHEMABINDING
AS RETURN (
SELECT 1 as canAccess WHERE
CAST(SESSION_CONTEXT(N'CompanyID') as int) = @CompanyID
)
Dans cet exemple, le prédicat indique que seuls les utilisateurs ayant une valeur dans SESSION_CONTEXT correspondant à un argument d'entrée peuvent accéder à la société. Vous pouvez mettre toute autre condition, par exemple, qui vérifie le rôle de la base de données ou l'identifiant de base de données de l'utilisateur actuel, etc.
La plupart du code ci-dessus est un modèle que vous allez copier-coller. La seule chose qui changera ici est le nom et les arguments du prédicat et de la condition dans la clause WHERE. Vous créez maintenant une stratégie de sécurité qui appliquera ce prédicat sur certaines tables.
Vous pouvez maintenant créer une politique de sécurité qui appliquera le prédicat sur certaines tables:
CREATE SECURITY POLICY dbo.CompanyAccessPolicy
ADD FILTER PREDICATE dbo.pUserCanAccessCompany(CompanyID) ON dbo.Company
WITH (State=ON)
Cette stratégie de sécurité affecte des prédicats à la table de l'entreprise. Chaque fois que quelqu'un essaie de lire des données de la table Société, la stratégie de sécurité applique un prédicat sur chaque ligne, transmet la colonne CompanyID comme paramètre du prédicat et le prédicat évalue si cette ligne est renvoyée dans le résultat de la requête SELECT.
Modification de la politique de sécurité RLS
La stratégie de sécurité est un groupe de prédicats associés aux tables pouvant être gérées ensemble. Vous pouvez ajouter ou supprimer des prédicats ou activer / désactiver toute la stratégie.
Vous pouvez ajouter d'autres prédicats sur les tables de la stratégie de sécurité existante.
ALTER SECURITY POLICY dbo.CompanyAccessPolicy
ADD FILTER PREDICATE dbo.pUserCanAccessCompany(CompanyID) ON dbo.Company
Vous pouvez supprimer des prédicats de la politique de sécurité:
ALTER SECURITY POLICY dbo.CompanyAccessPolicy
DROP FILTER PREDICATE ON dbo.Company
Vous pouvez désactiver la politique de sécurité
ALTER SECURITY POLICY dbo.CompanyAccessPolicy WITH ( STATE = OFF );
Vous pouvez activer la stratégie de sécurité désactivée:
ALTER SECURITY POLICY dbo.CompanyAccessPolicy WITH ( STATE = ON );
Empêcher la mise à jour à l'aide du prédicat de bloc RLS
La sécurité au niveau de la ligne vous permet de définir des prédicats qui contrôlent qui peut mettre à jour les lignes de la table. Vous devez d'abord définir une fonction de valeur de table qui représente le prédicat qui contrôlera la stratégie d'accès.
CREER UNE FONCTION
dbo.pUserCanAccessProduct (@CompanyID int)
RETURNS TABLE
WITH SCHEMABINDING
AS RETURN (SELECT 1 comme canAccess WHERE
CAST (SESSION_CONTEXT (N'CompanyID ') en tant qu'int) = @CompanyID
) Dans cet exemple, le prédicat indique que seuls les utilisateurs ayant une valeur dans SESSION_CONTEXT correspondant à l’argument en entrée peuvent accéder à la société. Vous pouvez mettre toute autre condition, par exemple, qui vérifie le rôle de la base de données ou l'identifiant de base de données de l'utilisateur actuel, etc.
La plupart du code ci-dessus est un modèle que vous allez copier-coller. La seule chose qui changera ici est le nom et les arguments du prédicat et de la condition dans la clause WHERE. Vous créez maintenant une stratégie de sécurité qui appliquera ce prédicat sur certaines tables.
Maintenant, nous pouvons créer une politique de sécurité avec le prédicat qui bloquera les mises à jour sur la table de produit si la colonne CompanyID de la table ne satisfait pas aux prédicats.
CREATE SECURITY POLICY dbo.ProductAccessPolicy ADD BLOC PREDICATE dbo.pUserCanAccessProduct (CompanyID) ON dbo.Product
Ce prédicat sera appliqué à toutes les opérations. Si vous voulez appliquer des prédicats sur certaines opérations, vous pouvez écrire quelque chose comme:
CREATE SECURITY POLICY dbo.ProductAccessPolicy ADD BLOC PREDICATE dbo.pUserCanAccessProduct (ID de l'entreprise) ON dbo.Product AFTER INSERT
Les options possibles que vous pouvez ajouter après la définition du prédicat de bloc sont les suivantes:
[{APRÈS {INSERT | METTRE À JOUR } }
| {AVANT {MISE À JOUR | EFFACER } } ]