This post is also available in:
Aufrufe: 6336
Der Einsatz von Benutzerrollen ist ein wichtiges Element, um den Zugriff auf die Daten restriktiv zu vergeben oder zu verunmöglichen. Der nachfolgende Artikel beschreibt die Möglichkeit, Measures nur für bestimmte Benutzer anzeigen zu lassen.
Willst du Power BI lernen?
Auf unseren neuen Seite Power BI Coach haben wir einen Onlinekurs zusammengestellt.
Ausgangslage
Kürzlich bekam ich eine interessante Anfrage. Die Frage drehte sich um folgende Aufgabenstellung:
- Die Geschäftsleitung darf alles sehen.
- Der Verkaufsleiter darf die Verkäufe aller Angestellten sehen, aber nicht alle Measures. Insbesondere die Measures “Product Cost”, “Profit pct” und “Sales Profit” darf er nicht sehen.
- Vertriebsmitarbeiter (Sales) dürfen nur ihre Verkäufe sehen und auch keinen Zugriff auf die genannten Measures haben.
- Die Lösung soll so aufgebaut sein, dass es den Endbenutzer nicht möglich ist, die Restriktionen zu umgehen.
Der dritte und vierte Teil der Frage ist mit Benutzerrollen (englisch Row Level Security) sehr einfach zu realisieren. Robert Lochner von Linearis hat dazu einen ausführlichen Beitrag geschrieben. Und auch Reza hat bereits einige Blogs dazu verfasst. Insbesondere sein Artikel “Dynamic Row Level Security with Manager Level Access in Power BI” bildet die Grundlage für meine Lösung.
Die pbix-Datei mit der Lösung für den heutigen Beitrag könnt ihr hier herunterladen. Ändert nach dem Download die Dateiendung von zip in pbix.
Benutzerrolle erstellen
Der zweite Teil ist schon ein wenig anspruchsvoller, aber durchaus machbar. Als erstes habe ich eine neue Tabelle namens “RLS” in Power Query erfasst und drei Personen unterschiedliche Rollen zugeteilt. Die neue Tabelle hat keine Beziehung zu den anderen Tabellen. Die restlichen Daten stammen aus der Demo-Datenbank “AdventureWorks DW 2014”.

Abbildung 1-Table Row Level Security per user
Über die Rolle wird festgelegt, was der einzelne User sehen darf. Dazu benötigen wir eine neue Benutzerrolle, welche wir nun erstellen.
Klickt auf den Menüpunkt “Rollen verwalten” im Tab “Modellierung”.

Abbildung 2-Menüpunkt Benutzerrollen
Im nun erschienenen Dialog sind fünf Schritte notwendig:

Abbildung 3-RLS Employee
- Klickt als erstes auf “Erstellen”.
- Benennt die neue Rolle nach eurem Gusto. Den Namen könnt ihr anpassen, indem ihr auf die drei Punkte rechts klickt und die Rolle umbenennt.
- Wählt die Tabelle, welche gefiltert werden soll.
Da wir die Daten in Abhängigkeit zum eingeloggten Benutzer filtern wollen, ist dies die Tabelle “DimEmployee”. - Gebt als nächstes die notwendige DAX-Formel ein. Ich werde diese nachstehend erläutern.
- Mit Klick auf “Speichern” ist die neue Benutzerrolle erfasst.
DAX Formel
Um eine dynamische Filterung über den Benutzer zu erreichen, reicht in einem einfachen Datenmodell die DAX Formel im Format[Benutzer] = Username()
aus. Damit wird sichergestellt, dass jeder Benutzer nur seine Daten sehen kann.
In unserem Beispiel müssen wir aber mehrere Schritte prüfen:
- Wer ist der aktuell eingeloggte Benutzer?
- Ist der Benutzer in der Tabelle “RLS” erfasst? Falls nein, sieht er gar keine Daten.
- Falls er erfasst ist, welche Rolle ist ihm zugeteilt? Ist er in der Rolle “Sales” und darf nur seine Daten sehen, oder gehört er zu einer der beiden anderen Rollen und darf alle Daten sehen?
Als erstes prüfen wir also, wer eingeloggt ist und ob der Benutzer in der Tabelle “DimEmployee” erfasst ist und somit Zugriff auf die Daten haben soll. Dies geschieht über [EmailAddress]=USERNAME()
Die E-Mail-Adresse wählen wir, da sich der Benutzer im Power BI ebenfalls über seine Emailadresse einloggt. Auf die Problematik bezüglich UPN (User Principal Name) gehe ich hier nicht näher ein. Reza hat auch dazu einen hervorragenden Artikel geschrieben. Lasst es mich wissen, falls ihr einen Blogartikel in Deutsch zu diesem Thema haben möchtet.
Als nächstes müssen wir die Tabelle “RLS” filtern. Dazu benutzen wir Filter(RLS, RLS[User]=USERNAME())
Achtung: Im Gegensatz zur üblichen DAX Schreibweise in deutschen Power BI Versionen, muss in der Benutzerrollendefinition das Semikolon durch das Komma ersetzt werden. Keine Ahnung wieso, ist halt so.
Nachdem der Benutzer auch diese Prüfung durchlaufen hat, fehlt noch die Zuteilung zur Rolle. Dazu verwenden wirmaxX (Filter(RLS, RLS[User]=USERNAME()) , [Role])
Die maxX Formel iteriert über die Tabelle “RLS” und gibt uns in Verbindung mit dem vorherigen Filter die Rolle des angemeldeten Benutzers zurück. Das Ergebnis prüfen wir auf die beiden Möglichkeiten “Board” und “GroupLeader”.
Falls eine der beiden Bedingungen zutrifft, so bekommt der Benutzer Zugriff auf alle Daten. Falls nicht, bekommt er nur auf seine Daten Zugriff. Wer gar nicht in der Benutzertabelle erfasst ist, bekommt keinen Zugriff.
Wie soll aber nun die Freigabe auf alle Daten möglich sein, wenn wir den Benutzer anhand seines Benutzernamens prüfen? Ganz einfach, wir benötigen eine Aussage, die TRUE zurückgibt. Dies ist in der einfachsten Form die Formel 1=1. Das Ergebnis dieser Berechnung ist ja immer richtig. 😉
DAX Formel zusammensetzen
Wenn wir alles zusammensetzen, erhalten wir folgende Formel mit der Kontrolle der Bedingungen:
Das Doppelzeichen || steht für “oder”. In der DAX-Formel für die Benutzerrollendefinition ist das DAX-Äquivalent nicht erlaubt.
Kontrolle der Benutzerrolle
Zur Kontrolle, ob die DAX Formel auch funktioniert, aktiviere ich die Rolle als Benutzer “linda3@adventure-works.com”.

Abbildung 4-RLS Login
Gleich neben dem Punkt “Rollen verwalten” findet ihr “Als Rollen anzeigen”. Nach dem Aktivieren öffnet sich der Dialog, in welchem ihr noch den Benutzer erfassen müsst und Rolle anklickt.
Das Resultat sieht wie folgt aus.

Abbildung 5-RLS Result Sales
Ich habe extra noch ein Measure “User” erstellt, um zu sehen, ob der Benutzer auch gewechselt hat. Die Formel für das Measure “User lautet: User = USERNAME()
Darunter seht ihr die Tabelle “RLS” mit den Benutzernamen und der Rolle und zuunterst die Daten der gewählten Benutzerin Linda.
Zur endgültigen Kontrolle prüfen wir das noch mit einem Groupleader. Auch das funktioniert und wir sehen anhand der grösseren Umsätze, dass der Gruppenleiter mehr Daten sieht.

Abbildung 6-RLS Groupleader
Und nochmals nebeneinander, um den Unterscheid hervorzuheben:

Abbildung 7-RLS Employee and Groupleader
Measures nur für bestimmte Benutzer anzeigen
Sicherlich habt ihr schon bemerkt, dass in den vorstehenden Bildern einige Measures leer sind. Das führt uns zur letzten Anforderung, dass Gruppenleiter und Sales nicht alle Measures sehen dürfen, Geschäftsleitungsmitglieder hingegen schon.
Erreicht habe ich dies ebenfalls über die Benutzersteuerung, und zwar über zwei Schritte.
Einerseits über eine dritte Spalte der Tabelle “RLS”. Diese definiert, ob ein Benutzer alle Measures sehen darf (1) oder nicht (0).

Abbildung 8-Table RLS Show Measure
Und andererseits über eine neue DAX Formel unter Benutzerrolle für die Tabelle “RLS”:
Der einzige Unterschied zur vorherigen Formel ist der Bezug auf die Spalte RLS[User].
Das alleine reicht aber noch nicht aus. Wir müssen noch die fünf Measures sowie ein Hilfsmeasure definieren.
Definition der Measures
Zuerst die einfachen Measures:
Sales Amount = SUM(FactResellerSales[ExtendedAmount])
Sales Units = SUM(FactResellerSales[OrderQuantity])
Das Hilfsmeasure steuert die Anzeige der restlichen drei Measures:
Lookupvalue gibt aus der Spalte “Show Measures” der Tabelle “RLS den Wert zurück, falls der User (RLS[User]) dem angemeldeten Benutzer [Username] entspricht. Der Rückgabewert ist gemäss der Tabellendefinition 1 oder 0.
Und mit diesem Wert können wir die restlichen Measures berechnen, indem wir das Ergebnis des RLS_Measures mit dem Ergebnis des anderen Measures multiplizieren und, falls notwendig, statt einer Null Blank (Leer) zurückgeben.
Schlussergebnis
Und das Resultat all der vorherigen Schritte sieht für das Geschäftsleitungsmitglied John Doe, der ja alles sehen darf, wie folgt aus:

Abbildung 9-RLS Board member
Das Ergebnis funktioniert auch mit Visualisierungen, hier am Beispiel eines Balkendiagramms. Ich habe die Resultate für alle drei Rollen nebeneinander gestellt. Nur John Doe sieht alle Measures und Linda sieht nur ihre Daten.

Abbildung 10-RLS Diagramms
Natürlich müssen im Power BI Service die Benutzer noch der erstellten Rolle zugeteilt werden. In den eingangs erwähnten Artikeln findet ihr Anleitungen dazu.
Fazit
Mit Anwendung der Benutzerrollen, soliden DAX Kenntnissen und einiger Fantasie können auch komplexere Szenarien gelöst werden. Ich hoffe, Ihr könnt etwas aus dem Beitrag mitnehmen.
Falls ihr einen anderen Lösungsansatz habt, so hinterlasst doch einen Kommentar oder schreibt mir. Schreibt auch, falls ihr Fragen oder Kommentare habt.
Die pbix-Datei mit der Lösung könnt ihr hier herunterladen. Ändert nach dem Download die Dateiendung von zip in pbix.
Happy Querying!