De afgelopen jaren ben ik bij veel consultancy opdrachten in aanraking gekomen met het implementeren van Row Level Security in Tableau. Hiermee bedoel ik het toegang geven tot specifieke delen van een tabel op basis van de ingelogde gebruiker. Hierdoor kan hetzelfde dashboard er anders uitzien afhankelijk van de rechten op de onderliggende database van de ingelogde gebruiker in Tableau Server. Om dit voor elkaar te krijgen zijn er een aantal opties in Tableau welke ik in dit artikel heb uitgelicht.
SQL Server impersonation
Met SQL Server impersonation is het mogelijk om met een ander account in te loggen op de MS SQL Server en zich vervolgens voor te doen als de ingelogde gebruiker in Tableau Server waardoor enkel de data geretourneerd wordt welke voor deze gebruiker beschikbaar is.
Het account wat inlogt op de MS SQL server heeft IMPERSONATE rechten nodig voor iedere gebruiker als wie hij zich wil voordoen. Het account wat inlogt op de MS SQL server kan zowel de run-as user van Tableau Server zijn of kan via embedded-credentials meegegeven worden aan de datasource definitie.
Voordeel van deze oplossing is dat database beheerders alle toegangsrechten tot hun data kunnen beheren op een centrale plaats waarbij deze rechten niet alleen voor Tableau afgedwongen worden, maar ook voor alle andere applicaties welke gebruik maken van deze data.
Wil je meer weten over SQL Server impersonation in Tableau lees dan de documentatie in de online handleiding.
Gepubliceerde Tableau Data Extract met security kruistabel
Indien je geen gebruik maakt van MS SQL server of wanneer je gebruik moet maken van een extract kun je de toegang tot rij-specifieke data ook door Tableau laten afdwingen. Hierbij maken we gebruik van een security kruistabel welke informatie bevat over welke gebruiker toegang krijgt tot welk deel van de datatabel. Deze data wordt via een left-join samengevoegd met de originele dataset.
Stel onze originele dataset ziet er als volgt uit:
Regio | Sales |
---|---|
Noord | 75 |
Oost | 50 |
Zuid | 100 |
West | 80 |
En daarnaast hebben we een tabel welke definieert wie toegang krijgt tot welke data.
Regio | Usernames |
---|---|
Noord | *Carl*,*Carlos*,*Martijn*,*Daniel*,*Rik* |
Oost | *Martijn* |
Zuid | *Martijn*,*Daniel* |
West | *Martijn*,*Rik* |
Hieruit blijkt dat Martijn toegang heeft tot alle data, iedereen mag Noord zien en daarnaast mag Daniel Zuid zien en Rik West.
Stap 1: Left-join met security kruistabel
Maak een left-join tussen je dataset en de security kruistabel.
De resulterende dataset ziet er dan als volgt uit:
Regio | Sales | Usernames |
---|---|---|
Noord | 75 | *Carl*,*Carlos*,*Martijn*,*Daniel*,*Rik* |
Oost | 50 | *Martijn* |
Zuid | 100 | *Martijn*,*Daniel* |
West | 80 | *Martijn*,*Rik* |
Stap 2: Extract
Omdat de extract van onze dataset alle data moet bevatten en we pas later in Tableau de data per gebruiker gaan filteren maken we nu een volledige extract van de data.
Stap 3: Calculated field
Volgende stap is om in Tableau een boolean calculated field te maken waarmee we kunnen filteren op de ingelogde gebruiker. We maken hierbij gebruik van de functie USERNAME()
.
CONTAINS([Usernames] ,"*"+USERNAME()+"*")
Let hierbij op dat we testen of er een asterisk symbool om de username staat zodat we voorkomen dat Carl ook de data van Carlos mag zien en afdwingen dat een lege USERNAME()
geen true teruggeeft.
Stap 4: Data source filter
Het zojuist gemaakte calculated field gebruiken we vervolgens in een data source filter waarbij we enkel de optie “true” willen overhouden. Let er op dat we niet gebruik maken van een Extract filter of een filter binnen het workbook.
Stap 5: Test
Een eerste controle op de werking kan gedaan worden door met Tableau Desktop in te loggen in Tableau Server en via de optie “Filter as User” te selecteren als welke gebruiker je de data wil zien.
Stap 6: Publiceren van de datasource naar Tableau Server
Zolang het filter in het workbook aanwezig is kan het door een gebruiker gewijzigd of verwijderd worden. Om dit te voorkomen publiceren we de databron naar de Tableau Server waarbij de Row Level Security afgedwongen wordt door de Tableau Server en niet meer gewijzigd kan worden door individuele gebruikers, ongeacht of ze verbinding maken via Tableau Desktop of de Webedit functionaliteit van Tableau Server.
Houdt er daarbij rekening mee dat de controle optie van stap 5: Filter as User niet meer werkt, je moet echt volledig uitloggen en opnieuw inloggen als een andere gebruiker om zijn data te zien.