Business Intelligence/16. Oktober 2023 -Aktualisiert am 21. Dezember 2023

Measure-Level-Security in Microsoft Power BI

Illustration eines Pfeils, der das Sicherheitslevel angibt.

Manchmal ist es notwendig, den Datenzugriff für mehrere Benutzer zu beschränken. Für diesen Fall bietet Power BI etwas, das "Row-Level-Security" oder kurz RLS genannt wird.

Auch wenn RLS in den meisten Fällen gut funktioniert, würden wir davon abraten, wenn eine feinere Kontrolle benötigt wird. In diesem Blog-Beitrag möchten wir die sogenannte "Measure-Level-Security", kurz MLS, vorstellen. MLS ist im Wesentlichen dasselbe wie RLS, der Hauptvorteil besteht jedoch darin, dass die Berechtigungen direkt in Ihre Measures integriert sind. Alles, was benötigt wird, ist eine Tabelle oder eine externe Datei, in der die Benutzer und Berechtigungen eingerichtet sind.

Bevor wir uns mit den Details befassen, werfen wir einen Blick darauf, was wir erreichen wollen. In der Abbildung unten sehen wir, dass der Benutzer John Doe die Berechtigung hat, die Verkaufsdaten zu sehen.

Balkendiagramm mit Verkaufszahlen

"Vor der Anwendung von Measure-Level-Security"

Aber vielleicht wollen wir seinen Zugriff auf diese Informationen einschränken, so dass John diese Datenpunkte nicht mehr sehen kann. Wie im nächsten Bild zu sehen ist, kann er die Verkaufsdaten nicht mehr sehen, nachdem wir Measure-Level-Security angewendet haben.

Diagramm ohne Kennzahlen

"Nach der Anwendung von Measure-Level-Security"

Erstellen der Measures

In unserem Beispiel verwenden wir einfach eine Tabelle, die wir direkt in unserer pbix-Datei erstellt haben. Es kann aber auch eine Excel-Datei verwendet werden, die sich im SharePoint-Ordner befindet und für die der Zugriff beschränkt werden kann. Für die Produktionsumgebung empfehlen wir dringend den letzteren Ansatz, da nur Personen, die auf die Datei zugreifen und sie bearbeiten können, die Berechtigungen auf diese Weise ändern können.

pp-measure-level-security-example

In unserem Beispielfall haben wir Verkaufsdaten und nur zwei Benutzer, Jane und John, von denen nur Jane die Verkaufszahlen sehen darf. Für den Umsatzbetrag (Sales Amount) würden Sie normalerweise eine einfache Kennzahl erstellen:

1Sales Amount = SUM( Sales[Amount] )
mysql

Um die Berechtigungen festzulegen, brauchen wir etwas, um den spezifischen Benutzer zu identifizieren. Glücklicherweise stellt uns Power BI eine Funktion zur Verfügung, die den "User Principal Name" zurückgibt, d. h. die E-Mail-Adresse eines Benutzers, der bei Power BI angemeldet ist. Wir werden diese Maßnahme "UPN" nennen und sie mit dieser Zeile erstellen:

1UPN = LOWER( USERPRINCIPALNAME() )
mysql

Wie bereits erwähnt, haben wir eine Berechtigungstabelle erstellt, die den Benutzernamen, die E-Mail und die Berechtigungsspalte showSales enthält, die einen BOOLEAN-Datentyp (True oder False) hat. Der Vorteil der Verwendung eines booleschen Wertes in der Spalte showSales ist, dass wir die Berechtigungen mit der IF()-Funktion prüfen, die als erstes Argument einen LogicalTest annimmt und True oder False zurückgibt, so dass wir einfach auf unsere Maßnahme verweisen und unseren Code kürzer halten können.

Verwendung von LOOKUPVALUE() zum Abrufen von Benutzerberechtigungen

Als Nächstes müssen wir eine weitere Kennzahl erstellen, die wir "Show Sales" nennen werden. Hier werden wir unsere Berechtigungslogik auf der Grundlage unseres [UPN]-Measures implementieren. Damit führen wir mit der Funktion LOOKUPVALUE(), die der VLOOKUP() von Excel entspricht, eine Suche in der Tabelle Berechtigungen durch und geben Blank zurück, wenn kein Wert gefunden wurde. Die Funktion benötigt mindestens drei Argumente:

  1. Result_ColumnName
  2. Search_ColumnName
  3. Search_Value1 (2, 3, …)

Im Vergleich zu VLOOKUP() in Excel ist die Reihenfolge in der Funktion LOOKUPVALUE() genau umgekehrt. Zunächst müssen wir der Funktion mitteilen, aus welcher Spalte wir das Ergebnis abrufen wollen. Zweitens müssen wir die Spalte angeben, in der die Funktion suchen soll. Schließlich müssen wir der Funktion einen Wert übergeben, der für die Suche verwendet werden soll. In unserem Fall ist das Ergebnis, d. h. die Erlaubnis, in der Spalte Permissions[showSales] (Result_ColumnName) abgelegt und kann entweder True oder False sein. Für die Suche verwenden wir die E-Mail-Adresse des angemeldeten Benutzers, die mit unserer [UPN] Measure verbunden ist (Search_Value1). Wir können nun diese E-Mail-Adresse mit derjenigen in der Spalte Permissions[email] (Search_ColumnName) abgleichen.

Da LOOKUPVALUE() BLANK zurückgibt, wenn nichts übereinstimmt, werden wir die Funktion in eine andere Funktion verpacken, die stattdessen False zurückgibt, und False als Standard.

1Show Sales = 
2VAR permission = LOOKUPVALUE ( 
3    Permissions[showSales] 
4    , Permissions[email] 
5    , [UPN] 
6) 
7RETURN 
8  IF ( 
9   ISBLANK(permission) 
10   , FALSE() 
11   , permission 
12  )
mysql

Erweiterung der Measures mit Measure-Level-Security

Jetzt haben wir alles vorbereitet, um unsere Measure [Umsatz] mit Measure-Level-Security zu erweitern. Wir verwenden wieder die IF()-Funktion, geben aber einen leeren Stringwert "" als ResultIfFalse-Parameterwert zurück. Mit diesem kleinen Zusatz stellen wir sicher, dass alle anderen Berechnungen funktionieren und z. B. die Gesamtwerte in unseren Tabellen oder in unserem Fall die Obstnamen angezeigt werden. Der endgültige Ausdruck sieht wie folgt aus:

1Sales Amount = 
2IF ( 
3    [Show Sales] 
4    , SUM(Sales[Amount]) 
5    , "" 
6)
mysql

Überprüfung der Benutzerrechte mit der Funktion „View as Roles“

Nun prüfen wir, ob unser Berechtigungsfilter funktioniert. Dazu verwenden wir die Funktion "View as Roles", die Sie auf den Tab "Modeling" finden können. Wir klicken auf die Schaltfläche View as Roles und geben die E-Mail-Adresse, die wir als nächstes prüfen wollen, in das Feld Other ein.

Modeling Tab: View as Roles

"Modeling Tab: View as Roles"

Wie würde unser Bericht aussehen, wenn wir als Jane Doe eingeloggt wären?

Balkendiagramm mit Verkaufszahlen

"Measure-Level-Security: Jane kann immer noch die Verkaufsdaten sehen"

Und was ist mit John Doe? Kann er die Verkaufsdaten immer noch sehen? Wie wir vom Anfang des Artikels wissen, ist das nicht der Fall.

Diagramm ohne Kennziffern

"Measure-Level-Security: John kann die Verkaufsdaten nicht sehen"

Next Steps

Es können auch umfassendere Berechtigungen auf der Grundlage der E-Mail-Adresse selbst in Betracht gezogen werden. Es werden also keine Tabelle oder externe Dateien benötigt. Vielleicht haben externen Geschäftspartner eine Organisations-E-Mail, die "extern" im Namen enthält, wie john.doe.external@peaksandpies.com. Dann lässt sich die Funktion CONTAINSSTRING() verwenden und nach dem Schlüsselwort "external" suchen:

1isExternal = CONTAINSSTRING([UPN], "external")
mysql

Natürlich hängt es letztendlich von dem spezifischen Anwendungsfall ab, aber wir hoffen, dass wir einen hilfreichen Ansatz zeigen konnten.