Jogosultságok kiosztása egy relációs táblából? ... Bizarr, de megoldható!

Képzeljünk el egy nagy szervezetet, sok-sok OLAP felhasználóval. Ez a szervezet célul tűzte ki, hogy Üzleti Intelligencia rendszerét kiterjeszti ügyintéző szintre, azaz lehetőséget biztosít ügyintézőinek, hogy elemezhessék saját forgalmi adataikat

A szervezet ugyancsak célul tűzte ki, hogy OLAP adatkockáiban olyan jogosultság kezelési rendszert valósít meg, amelynek karbantartása nem igényel kézi karbantartást. Álláspontjuk szerint az alaprendszerekben megtalálható minden olyan információ, amely alapján meghatározható, hogy ki milyen adatokhoz férhet hozzá, így a jogosultságok kiosztása automatikusan megoldható.

Az OLAP rendszertől tehát elvárják, jogosultság kezelési rendszerét az alaprendszerekben tárolt táblák adatai alapján, maga tartsa karban. No erre kellett kitalálnom valamit...

Hipotézis

Ha le tudjuk kérdezni azt OLAP-ból kliens oldalon, hogy ki jelentkezett be, és tudjuk azt, hogy ez a felhasználó milyen dimenzió elemeket láthat, akkor a probléma megoldható.

Egyszerűsítsük a megoldást egy egydimenziós adatkockára, mely csak az ügyintéző dimenzióval van dimenzionálva, és minden egyes ügyintéző csak a saját szeletét láthatja az adatkockában.

Dinamikus jogosultság kezelés - SSAS
1. ábra

Kézzel könnyen megoldhattuk volna a problémát: gjakab felhasználónak jogosultságot kellett volna adnunk gjakab adataihoz, totto-nak totto-hoz és így rendre a többi 100 felhasználóhoz. (gjakab a 100 000 Ft-os sort, totto a 121 000 forintos sort láthatná) De mi ezt nem kézzel akarjuk megoldani, hanem dinamikusan: A bejelentkezett felhasználó neve jelöli ki a kocka látható szeletét

Célunkat úgy fogjuk elérni, hogy nevezett felhasználóknak olvasási jogot adunk a kockához, és utána a FILTER MDX függvénnyel szűkítjük a látható dimenzió elemek körét oda, ahol az [alias] attribútum = a felhasználó bejelentkezési nevével

Megvalósítás

Első lépésként az OLAP felhasználókat tömörítő felhasználó csoportnak olvasási (read permission) jogosultságot kell adni mind az adatbázisra, mind az adatkockára (General és Cubes fülek a jogosultság (role) szerkesztési ablakon)

Második lépésként le kell korlátozni a fent engedélyezett jogosultságot, hogy az ügyintéző ne az összes ügyintéző, hanem csak saját maga adatait láthassa. Ehhez le kell tudnunk kérdezni az aktuálisan bejelentkezett felhasználó nevét. Erre a USERNAME MDX függvényt fogjuk használni:

WithMember Measures.CurrentUser as 'username'
Select Measures.CurrentUser on 0 from [TestCube]

(A USERNAME MDX függvény a felhasználó nevét annak domain nevével adja vissza. Pl.: Szervezet\gjakab)

Elkaptuk az aktuálisan bejelentkezett felhasználó nevét. Már csak azt kell megadnunk, hogy csak azt a szeletet lássa, ahol az [ALIAS] Attribútum egyenlő az aktuálisan bejelentkezett felhasználó nevével. Ehhez a FILTER MDX függvényt fogjuk használni:

Filter([Ügyintéző].[Ügyintéző].Members,
[Ügyintéző].[Alias].currentmember.name = Username)

Vagy, ha az [Alias] attribútumot member properties-ként definiáltuk (Vagy 2000-es OLAP szerver használata esetén):

Filter([Ügyintéző].[Ügyintéző].Members,
[Ügyintéző].[Ügyintéző].Properties("Alias") = UserName)

Vagy, ha az [Alias] attribútum nem tartalmazza a domain nevet, akkor egyenlőség helyett InStr függvénnyel:

Filter([Ügyintéző].[Ügyintéző].Members,
InStr(1, [Ügyintéző].[Alias].currentmember.name, Username))

Felhasznált irodalom:

Kővári Attila - BI projekt

Új hozzászólás