Octroi d'autorisations de niveau ligne dans SQL Server (ADO.NET)
Mise à jour : November 2007
Dans certains scénarios, il peut être nécessaire de contrôler l'accès plus précisément que par les seuls octroi, révocation et refus d'autorisations sur les données. Prenons l'exemple d'un hôpital qui utilise une application de base de données pour stocker les informations sur les patients dans une table unique. Il pourra être nécessaire de limiter l'accès des médecins aux informations concernant uniquement leurs propres patients. Des scénarios similaires existent dans de nombreux environnements, notamment dans les applications financières, juridiques, publiques et militaires. SQL Server ne prend pas en charge l'implémentation de la sécurité de niveau ligne. Vous devez créer des colonnes supplémentaires dans vos tables qui définissent des mécanismes de filtrage des lignes.
Implémentation d'autorisations de niveau ligne
Les autorisations de niveau ligne sont utilisées pour les applications qui stockent des informations dans une table unique. Chaque ligne est associée à une colonne qui définit un paramètre de différenciation, comme un nom d'utilisateur, une étiquette ou tout autre identificateur. Vous devez ensuite créer des procédures stockées paramétrables, en leur passant la valeur appropriée. Les utilisateurs ne peuvent alors consulter que les lignes qui correspondent à la valeur fournie.
Les étapes suivantes décrivent comment configurer des autorisations de niveau ligne reposant sur un nom d'utilisateur ou un nom d'accès.
Créez la table en ajoutant une colonne supplémentaire pour stocker le nom.
Créez une vue contenant une clause WHERE reposant sur la colonne de nom d'utilisateur. Les lignes retournées seront ainsi limitées à celles contenant la valeur spécifiée. Utilisez l'une des fonctions intégrées afin de spécifier un nom d'utilisateur ou d'accès pour la base de données. Cela vous évite d'avoir à créer des vues distinctes pour différents utilisateurs.
' Returns the login identification name of the user.
WHERE UserName = SUSER_SNAME()
' USER_NAME or CURRENT_USER Return the database user name.
WHERE UserName = CURRENT_USER()
Créez des procédures stockées pour sélectionner, insérer, mettre à jour et supprimer des données en fonction de la vue, et non des tables de base. La vue fournit un filtre qui limite les lignes renvoyées ou modifiées.
Pour les procédures stockées qui insèrent des données, capturez le nom d'utilisateur en utilisant la même fonction que celle spécifiée dans la clause WHERE de la vue et insérez cette valeur dans la colonne UserName.
Refusez au rôle public toutes les autorisations sur les tables et les vues. Les utilisateurs ne pourront pas hériter des autorisations d'autres rôles de base de données car la clause WHERE repose sur des noms d'utilisateurs ou d'accès, et non sur des rôles.
Accordez aux rôles de base de données l'autorisation EXECUTE sur les procédures stockées. Les utilisateurs ne peuvent accéder aux données que par le biais des procédures stockées fournies.
Ressources externes
Pour plus d'informations, voir la ressource suivante :
Implementing Row- and Cell-Level Security in Classified Databases Using SQL Server 2005 (en anglais) sur le site SQL Server TechCenter. |
Décrit comment utiliser la sécurité de niveau ligne et de niveau cellule pour répondre aux spécifications de sécurité des bases de données confidentielles. |
Voir aussi
Concepts
Scénarios de sécurité des applications dans SQL Server (ADO.NET)
Gestion des autorisations à l'aide des procédures stockées dans SQL Server (ADO.NET)
Écriture de code SQL dynamique sécurisé dans SQL Server (ADO.NET)