Lidmaatschap met meerdere rollen in Value Level Security

Sinds enkele jaren werken wij met het concept van Value-level security (VLS). Kortom, met VLS kunt u de zichtbaarheid beveiligen van niet rijen, zoals bij beveiliging op rijniveau, of attributen, zoals bij beveiliging op kolomniveau, maar van specifieke waarden in specifieke rijen. U kunt bijvoorbeeld het kenmerk loonniveau verbergen voor elke werknemer met een loonniveau […]

Sinds enkele jaren werken wij met het concept van Value-level security (VLS). Kortom, met VLS kunt u de zichtbaarheid beveiligen van niet rijen, zoals bij beveiliging op rijniveau, of attributen, zoals bij beveiliging op kolomniveau, maar van specifieke waarden in specifieke rijen. U kunt bijvoorbeeld het kenmerk loonniveau verbergen voor elke werknemer met een loonniveau dat gelijk is aan of hoger dan dat van de huidige gebruiker.

Ik leg hier niet uit hoe je VLS moet implementeren; in ons Extreme DAX-boek uit 2022 is een hoofdstuk gewijd aan beveiliging, inclusief VLS en enkele andere VLS-gerelateerde concepten. We hebben VLS ook op verschillende conferenties gepresenteerd.

Het leuke van kennis delen is dat mensen het soms toepassen en terugkomen met specifieke vraagstukken en vragen. Dit leidt tot nieuwe oplossingen en het verder aanscherpen van bestaande oplossingen. Dit bericht gaat over een dergelijk probleem.

In VLS werken we met privéattributen die op rijniveau zichtbaar zijn (positieve gevallen) of vervangen door blanco waarden (negatieve gevallen). Dit wordt bepaald door specifieke DAX-beveiligingsuitdrukkingen, bestaande uit een positieve en een negatieve clausule. Het idee is dat elke gebruiker altijd toegang heeft tot precies één van de twee cases via een beveiligingsfilter op rijniveau. Op deze manier kunt u bepalen welke privékenmerken zichtbaar zijn voor een specifieke gebruiker:

Als u echter meerdere beveiligingsrollen hebt gedefinieerd die verschillende beveiligingsbeleidsregels implementeren, heeft een gebruiker mogelijk toegang tot zowel de positieve als de negatieve hoofdletters voor een specifieke gegevensrij. Dit leidt tot dubbele rijen in het rapport, zoals in het onderstaande voorbeeld.

Hier heeft de rapportgebruiker twee rollen; de ene geeft toegang tot het negatieve geval voor Alethea Allen, terwijl de andere toegang geeft tot het positieve geval. In feite geeft de tweede rol toegang tot alle positieve cases!

Het is niet mogelijk om dit probleem op te lossen als onderdeel van de beveiligingsrollen zelf, omdat geen enkele rol enige kennis heeft over andere rollen. Dit betekent dat je geen beveiligingsfilters kunt schrijven zoals ‘als de positieve rij zichtbaar is voor deze gebruiker via een andere beveiligingsrol, verberg dan de negatieve rij’. Maar gelukkig hoeven we niet per se alle DAX-maatregelen te veranderen.

De manier om dit op te lossen is door een specifieke DAX-meting te maken die als filter kan worden gebruikt op elke visual die privékenmerken gebruikt. Het probleem is dat een gebruiker zowel de blanco waarde als de juiste waarde van een privéattribuut te zien krijgt; het is dan zinvol om de blanco waarde weg te filteren. Hier is de formule:

ShowPrivate =

VAR ThisPrivateValue = MAX(‘Employee (private)'[Private])

VAR OverallPrivateValue =

    CALCULATE(

        MAX(‘Employee (private)'[Private]),

        ALL(‘Employee (private)’),

        VALUES(‘Employee (private)'[EmpNr])

    )

RETURN

IF(ThisPrivateValue = OverallPrivateValue, 1, 0)

Bij deze meting wordt ervan uitgegaan dat de context precies één rij Werknemer (privé) bevat. De variabele ThisPrivateValue haalt het Private attribuut van deze rij op (positief of negatief). De variabele OverallPrivateValue bepaalt het grootste Privé-attribuut voor deze werknemer dat zichtbaar is voor de huidige rapportgebruiker. Merk op dat deze waarde 1 is voor het positieve geval en 0 voor het negatieve geval.

Als ThisPrivateValue gelijk is aan 0 (dus we kijken naar het negatieve geval) maar het positieve geval kan ook worden gebruikt, retourneert de meting 0. In andere gevallen retourneert deze 1. Houd er rekening mee dat de situatie waarin ThisPrivateValue = 1 en OverallPrivateValue = 0 kan niet gebeuren. We kunnen nu het filter ShowPrivate = 1 op de visual gebruiken om negatieve cases effectief te verbergen waarvoor de positieve case ook zichtbaar is. Het resultaat staat hieronder.

Ik moet toegeven dat dit niet alle problemen oplost. Een filter bestuurt de rijen met gegevens die in de tabel worden weergegeven. Dit betekent dat als u een visual heeft met bijvoorbeeld het verkoopresultaat per loonniveau (ervan uitgaande dat dit een privékenmerk is), het resultaat voor het blanco loonniveau niet correct zou zijn. Dit is een onderwerp voor een andere blogpost.

2024. Quanto B.V.