Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
W skrócieOLS (Object Level Security, zabezpieczenia na poziomie obiektu) ukrywa wskazane kolumny przed wybraną rolą. Dla tej roli kolumna nie istnieje: zapytanie DAX z jej nazwą kończy się błędem, a miary i wizualizacje, które z niej liczą, przestają działać. Ukrycie kolumny w raporcie tego nie daje, a etykieta poufności chroni cały plik, nie kolumnę.
Lekcja 22 z 28 bezpłatnego kursu Power BI, od pierwszego raportu do Fabric i Copilota, na jednym zestawie danych sieci Nordvella.
<-- Spis wszystkich lekcjiW Nordvelli sprzedawca ma wiedzieć, ile sprzedał, ale nie ile firma na tym zarobiła. W tym rozdziale dodamy do modelu z lekcji 21 rolę Sprzedawca i w Tabular Editorze schowamy przed nią kolumnę marży. Efekt sprawdzimy na stronie Dashboard i w widoku zapytań DAX, a potem znajdziemy przeciek: marżę da się policzyć z dwóch innych kolumn. Zamkniemy go, pokażemy, czego Power BI nie pozwala łączyć, i wyjaśnimy, dlaczego przycisk Poufność bywa wyszarzony.
Z tej lekcji dowiesz się:
Pliki do tej lekcji
Gotowy efekt: plik Power BI Desktop w stanie z końca tej lekcji, z tymi samymi zapytaniami, modelem i stronami raportu, które widać na zrzutach. Etykiety poufności w nim nie ma: nadaje się ją dopiero po włączeniu etykiet w organizacji (sekcja o etykietach).
Plik startowy: stan z końca poprzedniej lekcji. Otwórz go, jeśli chcesz wykonywać kroki tej lekcji od razu, bez odtwarzania wcześniejszych.
Dane źródłowe:
Nordvella_
Power BI ma trzy mechanizmy, które potocznie nazywa się zabezpieczeniem raportu. Działają na różnych poziomach i odpowiadają na różne pytania, więc jeden nie zastąpi drugiego.
| Mechanizm | Co chroni | Gdzie się go ustawia | Co widzi osoba bez dostępu |
|---|---|---|---|
| Etykieta poufności | cały plik .pbix i pliki eksportowane do Excela, PowerPointa i PDF | Microsoft Purview (administrator), potem przycisk Poufność w Desktopie | oznaczenie pliku; ochrona zależy od ustawień etykiety |
| OLS | wybrane kolumny i tabele | Tabular Editor (Desktop nie ma do tego okna) | błąd zamiast danych: kolumna dla roli nie istnieje |
| RLS | wybrane wiersze | okno Zarządzaj rolami w Desktopie (lekcja 21) | mniej wierszy, ale wszystkie kolumny |
Model z lekcji 21 ma już pięć ról RLS: Region Południe, Sklep Warszawa, E-commerce, Flagowce Kraków i Katowice oraz Manager sklepu. Dokładamy szóstą rolę, Sprzedawca, która nie ogranicza wierszy, tylko kolumny.
Co chcemy osiągnąć. Chcemy dodać do modelu rolę Sprzedawca bez filtra wierszy, obok pięciu ról z lekcji 21. OLS zawsze ustawia się dla konkretnej roli, więc bez niej nie ma czego zabezpieczać.
Otwórz plik startowy nordvella_
Kliknij Nowy. Na górze listy pojawi się rola Bez tytułu i tu jest pierwsza pułapka tego okna. Pisanie zaraz po kliknięciu niczego nie zmienia, bo fokus zostaje na przycisku Nowy. Jeśli wpiszesz nazwę i naciśniesz Enter, Power BI potraktuje Enter jak kolejne kliknięcie Nowy i doda drugą rolę.
Nadmiarową rolę usuniesz z menu trzech kropek obok jej nazwy: kliknij kropki przy Bez tytułu (2) i wybierz Usuń. Power BI nie pyta o potwierdzenie.
Nazwę nadajesz tym samym menu. Kliknij trzy kropki przy roli Bez tytułu, wybierz Zmień nazwę, wpisz Sprzedawca i naciśnij Enter. W trybie zmiany nazwy Enter zatwierdza nazwę i nie tworzy nowej roli. Lista od razu sortuje się alfabetycznie, więc Sprzedawca przeskoczy na koniec.
Roli Sprzedawca nie dodawaj żadnej reguły. Panel Reguły zostaje pusty, więc rola widzi wszystkie wiersze. Kliknij Zapisz. Nad listą pojawi się zielony pasek Pomyślnie zastosowano zmiany ról, a przycisk Zapisz zrobi się nieaktywny. Zamknij okno przyciskiem Zamknij.
Co chcemy osiągnąć. Kolumna FaktSprzedaz[MarzaNetto] ma zniknąć dla roli Sprzedawca i zostać widoczna dla wszystkich pozostałych ról.
Power BI Desktop nie ma okna do OLS, tak samo jak nie ma okna do grup obliczeniowych. Ustawiasz je w bezpłatnym Tabular Editorze, który łączy się z modelem otwartym w Desktopie. Instalację i podłączenie opisaliśmy w lekcji 17. Przejdź na kartę Narzędzia zewnętrzne i kliknij Tabular Editor.
Tabular Editor otworzy się z drzewem modelu po lewej. Na pasku tytułu zobaczysz nazwę pliku i adres localhost z numerem portu: to ten sam model, który masz otwarty w Desktopie. W polu Filter na górze okna wpisz MarzaNetto i naciśnij Enter.
Pod drzewem, w prawym dolnym rogu okna, jest panel właściwości zaznaczonej kolumny. Zjedź w nim na sam dół, do sekcji Translations, Perspectives, Security. Pozycja Object Level Security ma opis Value assigned to 0 out of 6 Model Roles. Rozwiń ją strzałką po lewej: zobaczysz wszystkie sześć ról modelu, każdą z wartością Default.
Kliknij wartość Default w wierszu Sprzedawca, a potem strzałkę na prawym końcu pola. Lista ma trzy pozycje:
Default znaczy brak osobnego ustawienia, więc kolumna jest widoczna. Read jawnie ją dopuszcza i też zostawia widoczną. Po wybraniu None kolumny nie ma w modelu, który widzi rola.
Po wybraniu None opis pozycji zmieni się na Value assigned to 1 out of 6 Model Roles, a w wierszu Sprzedawca zobaczysz None.
Naciśnij Ctrl+S w Tabular Editorze. Na pasku stanu w lewym dolnym rogu pojawi się Changes saved., czyli zmiana trafiła do modelu w Desktopie. Do pliku .pbix trafi dopiero wtedy, gdy zapiszesz plik w Power BI Desktop (Ctrl+S w oknie Desktopu). Tabular Editor zostaw otwarty, przyda się jeszcze w tym rozdziale.
Zobacz też: Szkolenie Power BI - Desktop, DAX i Online + Copilot
Co chcemy osiągnąć. Chcemy zobaczyć raport i model oczami roli Sprzedawca, bez publikowania i bez drugiego konta.
Wróć do Power BI Desktop, na stronę Dashboard. Na karcie Modelowanie kliknij Wyświetl jako. W oknie Wyświetl jako role zaznacz Sprzedawca i kliknij OK.
Raport przeliczy się tak, jak zobaczy go sprzedawca. Nad stroną pojawi się pasek Oglądasz jako: Sprzedawca z przyciskiem Zatrzymaj wyświetlanie po prawej. Gdy pasek przykrywa górę strony, zmniejsz powiększenie przyciskiem minus w prawym dolnym rogu okna. My pracowaliśmy na 70%.
To pierwszy wniosek: OLS nie zostawia pustego miejsca w kolumnie Marża %, tylko wyłącza cały wizual, który z niej korzysta. Raport dla roli Sprzedawca nie może więc pokazywać miar opartych na marży. Wrócimy do tego przy przecieku.
Drugi test zrobisz w widoku zapytań DAX (ikona na lewym pasku, pod widokiem modelu). Widok zapytań działa pod rolą wybraną w Wyświetl jako, choć nie pokazuje paska roli. Wklej zapytanie i kliknij Uruchom:
// Czy rola Sprzedawca widzi miarę Łączna marża?
EVALUATE
ROW ( "Łączna marża", [Łączna marża] )
Gdy ktoś zgłosi, że raport się zepsuł, pierwsze pytanie brzmi, co dokładnie widzi. Power BI pokazuje różne komunikaty zależnie od wizualizacji i tylko część z nich wspomina o uprawnieniach.
Pod rolą Sprzedawca kliknij Zobacz szczegóły na karcie Marża %, a w oknie Pola, które trzeba naprawić rozwiń Zobacz szczegóły.
Na stronie Python i R to samo okno pojawia się przy wizualizacji R. Ona korzysta z kolumny bezpośrednio, więc w komunikacie pada nazwa kolumny: (FaktSprzedaz) MarzaNetto.
Strona 5 ma drzewo dekompozycji, które analizuje miarę Łączna marża. Bez roli działa normalnie i rozbija marżę na regiony, kategorie i miasta.
Pod rolą Sprzedawca w miejscu drzewa pojawia się komunikat, który z uprawnieniami nie ma nic wspólnego. Po kliknięciu Zobacz szczegóły zobaczysz to okno:
Osoba, która szuka przyczyny po treści komunikatu, zacznie sprawdzać tryb połączenia i miary, których nikt nie ruszał.
Wskazówka: gdy wizualizacja działa u Ciebie, a u kogoś innego pokazuje błąd, najpierw włącz Wyświetl jako z jego rolą. Jeśli błąd się powtarza, przyczyną są uprawnienia, nie model.
Najczęstsze nieporozumienie w tym temacie brzmi: ukryłem kolumnę w raporcie, więc nikt jej nie zobaczy. Ukrycie (prawy przycisk myszy na kolumnie w panelu Dane, Ukryj w widoku raportu) zmienia tylko listę pól. Kolumna zostaje w modelu.
Sprawdzisz to na kolumnie FaktSprzedaz[ProduktID], która w modelu jest ukryta. Uruchom w widoku zapytań DAX, nadal pod rolą Sprzedawca:
// Kolumna ukryta (ProduktID) to nie kolumna zabezpieczona
EVALUATE
TOPN (
5,
SELECTCOLUMNS (
FaktSprzedaz,
"SprzedazID", FaktSprzedaz[SprzedazID],
"ProduktID (ukryta)", FaktSprzedaz[ProduktID],
"KosztWlasny", FaktSprzedaz[KosztWlasny]
),
[SprzedazID], ASC
)
ORDER BY [SprzedazID]
Co chcemy osiągnąć. Sprawdzimy, czy rola Sprzedawca policzy marżę bez kolumny MarzaNetto, i zamkniemy tę drogę.
OLS chroni dokładnie te kolumny, które wskażesz. W tabeli faktów Nordvelli marża to wartość netto transakcji minus koszt własny, a obie te kolumny rola Sprzedawca nadal widzi. Sprawdź to pod rolą:
// Czy rola Sprzedawca odtworzy marżę z innych kolumn?
EVALUATE
ROW (
"Sprzedaż", [Łączna sprzedaż],
"Wartość minus koszt",
SUMX (
FaktSprzedaz,
FaktSprzedaz[WartoscNetto] - FaktSprzedaz[KosztWlasny]
),
"Marża katalogowa", [Marża katalogowa]
)
Bez roli miara Łączna marża daje 76 974 181,16 zł. Wyliczenie z kosztu różni się o 53 928,01 zł, czyli o 0,07%. Różnica bierze się stąd, że KosztWlasny jest zaokrąglony do pełnych złotych: na pojedynczej transakcji to najwyżej 0,99 zł, średnio 0,50 zł. Dla sprzedawcy to ta sama informacja, którą chcieliśmy schować. Drugą drogą jest miara Marża katalogowa, która liczy z kolumny DimProdukty[MarzaNetto], czyli z marży z cennika.
Dlatego OLS na jednej kolumnie to dopiero demonstracja mechanizmu. W prawdziwym modelu chronisz wszystkie kolumny, z których da się policzyć ukrywaną wartość. W Nordvelli są to cztery kolumny:
| Kolumna | Dlaczego ją chronimy |
|---|---|
| FaktSprzedaz[MarzaNetto] | marża z każdej transakcji, czyli sama chroniona wartość |
| FaktSprzedaz[KosztWlasny] | WartoscNetto minus KosztWlasny daje marżę z dokładnością do złotówki |
| DimProdukty[MarzaNetto] | marża katalogowa produktu w złotych; razem z ilością daje marżę katalogową 72,29 mln zł |
| DimProdukty[MarzaProc] | marża katalogowa produktu w procentach |
Kolumny planu, FaktBudzet[BudzetMarzy] i FaktBudzet[BudzetKosztow], zostawiliśmy widoczne. To plan, a nie wynik, a to, czy plan marży ma widzieć sprzedawca, decyduje firma, nie model.
Zanim zmienisz cokolwiek w Tabular Editorze, kliknij w Desktopie Zatrzymaj wyświetlanie. Zmiana modelu przy włączonym podglądzie roli kończy się komunikatem, że bieżąca sesja nie jest już prawidłowa. Potem w Tabular Editorze wpisz w filtrze Koszt, zaznacz kolumnę KosztWlasny pod FaktSprzedaz i ustaw dla roli Sprzedawca wartość None, tak samo jak przy marży.
Następnie wpisz w filtrze Marza i ustaw None dla roli Sprzedawca na kolumnach MarzaNetto i MarzaProc pod DimProdukty. Każdą kolumnę ustawiasz osobno: gdy zaznaczysz dwie kolumny naraz, pole Object Level Security jest puste i nie da się go rozwinąć. Na koniec Ctrl+S w Tabular Editorze i Ctrl+S w Desktopie.
Włącz ponownie Wyświetl jako z rolą Sprzedawca i uruchom tę część zapytania, która liczyła marżę z kosztu:
// Czy rola Sprzedawca odtworzy marżę z innych kolumn?
EVALUATE
ROW (
"Wartość minus koszt",
SUMX (
FaktSprzedaz,
FaktSprzedaz[WartoscNetto] - FaktSprzedaz[KosztWlasny]
)
)
Ceną są kolejne wyłączone wizualizacje. Miary liczone z zabezpieczonych kolumn, bezpośrednio albo przez inne miary, przestają działać dla roli. W modelu Nordvelli jest ich jedenaście:
| Miara | Dlaczego przestaje działać |
|---|---|
| Łączna marża | SUM z FaktSprzedaz[MarzaNetto] |
| Marża % i Marża % (VAR) | liczą z Łącznej marży albo wprost z MarzaNetto |
| Ocena Marzy | korzysta z miary Marża % |
| Marża katalogowa, Marża katalogowa % i Marża katalogowa bez VAR | liczą z DimProdukty[MarzaNetto] |
| Marża jednostkowa przy cenie testowej | korzysta z DimProdukty[MarzaNetto] |
| Marża po rabacie | korzysta z FaktSprzedaz[KosztWlasny] |
| Marża proc po rabacie i Ocena scenariusza | liczą z Marży po rabacie |
W pliku kursu te miary są na stronach Dashboard, Strona 5, Strona 7, Strona 8, Iteratory i Wydajność miar, a kolumnę MarzaNetto wprost wykorzystuje wizualizacja R na stronie Python i R. W prawdziwym wdrożeniu sprzedawcy dostają osobny raport na tym samym modelu, zbudowany bez tych miar, żeby nikt nie zaczynał dnia od komunikatów o błędach.
Sprzedawca z regionu Południe ma widzieć tylko swój region i nie widzieć marży. Pierwszy odruch to przypisać go do dwóch ról: Region Południe z lekcji 21 i Sprzedawca. Sprawdź to w Wyświetl jako, zaznaczając obie role naraz:
Rozwiązaniem jest jedna rola, która ma i filtr wierszy, i OLS. Załóż w oknie Zarządzaj rolami rolę Sprzedawca Południe z regułą na tabeli DimSklepy (w edytorze DAX okna ról):
[Region] == "Południe"Potem w Tabular Editorze ustaw dla niej None na tych samych czterech kolumnach co dla roli Sprzedawca. My sprawdziliśmy taką rolę z OLS na kolumnie MarzaNetto:
Trzecia warstwa to etykieta poufności, czyli oznaczenie całego pliku, na przykład Poufne albo Tylko do użytku wewnętrznego. Etykietę nadaje się na karcie Narzędzia główne przyciskiem Poufność. Jest spora szansa, że u siebie zobaczysz go wyszarzonego, tak jak my:
Przycisk ożyje dopiero wtedy, gdy organizacja zrobi dwie rzeczy po stronie administracji. Pierwsza: administrator Microsoft 365 tworzy etykiety w portalu Microsoft Purview i publikuje je zasadą dla użytkowników. W naszym środowisku demonstracyjnym lista etykiet jest pusta:
Druga: administrator Power BI włącza w portalu administracyjnym, w Ustawieniach dzierżawy, w sekcji Ochrona informacji, ustawienie Zezwalaj użytkownikom na stosowanie etykiet poufności dla zawartości. Można je włączyć dla całej organizacji albo dla wybranych grup.
Dopiero po obu krokach przycisk Poufność pokaże listę etykiet. Nadana etykieta zostaje w pliku .pbix i przechodzi na pliki Excela, PowerPointa i PDF eksportowane z raportu, zgodnie z opisem tego ustawienia. Dlatego na pytanie, czemu nie da się nadać etykiety, odpowiedź prawie nigdy nie leży w samym Desktopie. W pliku do pobrania etykiety nie ma.
W modelu jest teraz szósta rola, Sprzedawca, i cztery kolumny, które dla niej nie istnieją. Całość widać w drzewie Tabular Editora: pod rolą są dwie pozycje, FaktSprzedaz i DimProdukty, czyli tabele, w których rola ma ustawienia kolumn.
Lista kontrolna przed publikacją modelu z OLS:
Osoby przypisuje się do ról w usłudze Power BI, na stronie Zabezpieczenia modelu, tak jak w lekcji 21. W następnym rozdziale publikujemy raport w usłudze Power BI: obszary robocze, aplikacje i udostępnianie.
Komentarze (0)
Brak komentarzy...