Row Level Security
Introduction
Qu'est-ce que la RLS?
La RLS, ou Row-Level Security, est une méthode qui restreint l'accès aux données dans une base de données ou un environnement de BI selon les caractéristiques de l'utilisateur. Elle permet aux administrateurs de contrôler qui peut voir quelles données dans une même table ou un même rapport. C'est particulièrement utile lorsque certaines données sensibles ou privées ne doivent être accessibles qu'à certains utilisateurs.
Quelle est la différence avec le RBAC?
La RLS dans Power BI permet de contrôler l'accès aux lignes de données selon l'utilisateur qui consulte le rapport. Vous pouvez créer des filtres dans des rôles définis dans Power BI Desktop; lorsque les utilisateurs se connectent à Power BI, ils ne voient que les données correspondant à ces filtres.
Le RBAC, ou Role-Based Access Control, est plus large et contrôle l'accès à des niveaux plus élevés de l'environnement Power BI, pas seulement au niveau des données. Le RBAC sert à gérer qui a accès aux espaces de travail, rapports et dashboards, ainsi que les opérations permises, comme lire, écrire, partager ou supprimer.
Comment activer la RLS
Ce dont vous aurez besoin
La table users
La table users associe chaque utilisateur ayant accès aux données avec les données qu'il peut voir. Elle devrait être structurée ainsi:
user_id: l'identifiant unique de l'utilisateur, qui peut être rattaché à un élément du payload d'authentification Power BI.scope: la portée des données disponibles pour l'utilisateur. C'est une chaîne utilisée pour filtrer les données de reporting.
Comment configurer la RLS?
La RLS est implémentée en ajoutant la user_table à votre dashboard Power BI et en la joignant, par jointure interne, à la table de reporting. La user_table peut ensuite filtrer les données de la table de reporting selon les droits accordés à l'utilisateur.
Pour cela, vous devez créer un nouveau rôle dans votre dashboard Power BI et ajouter un filtre à la table de reporting qui limite les données selon le scope de l'utilisateur.
- Assurez-vous que votre modèle de données contient les colonnes nécessaires pour définir les filtres RLS. En pratique, les dimensions auxquelles vous voulez appliquer la RLS doivent être disponibles dans la table de reporting et dans la
user_table. Lauser_tabledoit aussi inclure une colonne d'identification principale de l'utilisateur, ici la colonneemail. - Importez la
user_tabledans votre dashboard Power BI et créez une relation entre lauser_tableet les tables de reporting. La jointure doit se faire sur la colonne de portée. - Créez et gérez un rôle:
- Dans Power BI Desktop, cliquez sur l'onglet
Model, puis surManage Roles. - Cliquez sur
Createpour créer un nouveau rôle. - Dans la boîte de dialogue
Manage roles, entrez un nom de rôle, puis cliquez surAdd Table Filter. - Dans la boîte
Table Filter DAX Expression, entrez une expression DAX qui filtre les données selon l'adresse courriel de l'utilisateur. Cela sert à filtrer la table des utilisateurs sur la personne qui consulte actuellement le dashboard. Par exemple:
'user_table'[email] = USERPRINCIPALNAME()- Cliquez sur
OKpour enregistrer l'expression DAX. - Cliquez sur
Savepour enregistrer le rôle. - Cliquez sur
Closepour fermer la boîteManage roles. - Publiez le rapport dans le service Power BI.
- Dans Power BI Desktop, cliquez sur l'onglet
Exemple: implémenter la RLS au niveau de l'école
Dans cet exemple, nous implémentons la RLS pour restreindre l'accès aux données selon l'adresse courriel de l'utilisateur, afin que chaque utilisateur ne voie que les données de l'école à laquelle il est associé.
Étape 1: créer la table users
La table users devrait contenir les colonnes suivantes:
email: l'adresse courriel de l'utilisateurschool: l'école associée à l'utilisateur
Étape 2: implémenter la RLS dans Power BI
- Importez la table
usersdans votre dashboard Power BI et créez une relation entre la tableuserset les tables de reporting. La jointure doit se faire sur la colonneschool. C'est le point important: si votre table de reporting NE contient PAS de colonneschool, vous ne pourrez pas joindre lauser_tableet vous ne pourrez pas appliquer de RLS à cette table. - Créez un rôle:
- Dans Power BI Desktop, cliquez sur l'onglet
Model, puis surManage Roles. - Cliquez sur
Createpour créer un nouveau rôle. - Dans la boîte de dialogue
Manage roles, entrez un nom de rôle, puis cliquez surAdd Table Filter. - Dans la boîte
Table Filter DAX Expression, entrez une expression DAX qui filtre les données selon l'adresse courriel de l'utilisateur. Par exemple:
user_table['email'] = USERPRINCIPALNAME()- Cliquez sur
OKpour enregistrer l'expression DAX. - Cliquez sur
Savepour enregistrer le rôle. - Cliquez sur
Closepour fermer la boîteManage roles. - Publiez le rapport dans le service Power BI.
- Dans Power BI Desktop, cliquez sur l'onglet
Pourquoi ça fonctionne?
Voici ce qui se passe lorsqu'un utilisateur consulte le rapport, au coeur du moteur Power BI:
- L'utilisateur se connecte à Power BI avec son courriel et le rapport s'affiche.
- Power BI assigne
USERPRINCIPALNAME()au courriel de l'utilisateur. - L'expression DAX du rôle est évaluée, et la
user_tableest filtrée sur le courriel de l'utilisateur. - Les tables jointes à la
user_tablesont maintenant filtrées selon ce courriel, et l'utilisateur ne voit que les données de l'école à laquelle il est associé.
Note sur USERPRINCIPALNAME()
USERPRINCIPALNAME() est une fonction DAX qui retourne l'adresse courriel de l'utilisateur actuellement authentifié. Cette fonction est disponible seulement dans le service Power BI, pas dans Power BI Desktop. Une fois le rapport publié dans le service Power BI, USERPRINCIPALNAME() retourne le courriel de l'utilisateur qui consulte le rapport. C'est utile pour filtrer les données selon l'adresse courriel.
Mon client veut une RLS au niveau de l'école, mais aussi au niveau de la classe. Comment faire?
Comme Power BI ne gère pas les jointures multi-colonnes, il faut concaténer les colonnes de jointure dans une seule colonne. Pour cela, créez une nouvelle colonne dans toutes vos tables de reporting et dans vos tables user_table. La colonne unique peut être créée en concaténant simplement les colonnes à joindre. Bien sûr, l'ordre de concaténation doit être exactement le même dans la user_table et dans la table de reporting, sinon la jointure ne fonctionnera pas. Si vous voulez faire plus élégant, vous pouvez le faire en SQL AVANT d'importer les données et utiliser le hachage de la concaténation comme colonne de jointure au lieu de la concaténation elle-même, afin d'économiser quelques précieux octets de mémoire.
