Sécurité dynamique avec une Factless

J’ai déjà parlé il y a longtemps de l’implémentation de la sécurité dynamique de dimensions (Dynamic Dimension Security en bon langage de newsgroup SSAS). Il s’agit pour ceux qui n’ont pas envie de limiter la vue des membres d’une dimension par une expression MDX dynamique pour chaque utilisateur, ce qui est possible par l’utilisation de la fonction MDX UserName, qui renvoie l’ID de l’utilisateur connecté.

C’est très facile à faire lorsque l’on a une notion d’utilisateur dans le cube, comprendre lorsque les faits à sécuriser sont à la granularité de l’utilisateur: on rajoute le login en tant que Member Property dans le cube et c’est presque terminé. C’est d’ailleurs ce que j’avais fait dans mon exemple. En revanche que faire lorsque le cube est à une granularité supérieure? Lorsque la notion d’utilisateur n’y est pas représentée d’un point de vue métier? On peut alors représenter cette notion d’utilisateur dans une ou plusieurs tables de faits dédiées, et gérer la sécurité à l’aide de relations Many-To-Many. C’est d’ailleurs ce que l’on fait en SQL lorsque l’on doit gérer de la sécurité à la ligne de données.

Capture

Une dimension technique d’utilisateur

On va d’abord créer une dimension Utilisateur, qui a un sens uniquement technique. Potentiellement cette dimension peut ne contenir que deux attributs, une Surrogate Key et un identifiant type Active Directory. Cet identifiant peut aussi être un identifiant autre, applicatif que l’on pourra passer via le noeud CustomData de la chaîne de connexion (plutôt que d’utiliser le UserID).

Une table de faits Factless par Securable

Mettons que l’on ait un reporting dans le cube fait par Unité Organisationnelle, chacune pouvant être vue par un ou plusieurs utilisateurs: on va créer une table de faits FactlessDroitsUniteOrganisationnelle qui sera simplement composée d’un doublet (UniteOrganisationnelleID, UtilisateurID). On crée un groupe de mesure pour chacune dans le cube. On a donc une relation Fait -> DimUniteOrganisationnelle <- FactlessDroitsUniteOrganisationnelle -> DimUtilisateur.

Une relation Many-To-Many par Securable

Chaque fait relié à un élément à sécuriser dispose alors d’une relation Many-To-Many avec une instance en Role Playing Dimension de la dimension Utilisateur. On crée donc dans le cube autant d’instances de cette dimension que l’on a de dimensions à sécuriser. Pour chaque table de faits concernée par une relation avec une dimension à sécuriser, on rajoute dans le Dimension Usage une relation Many-To-Many avec l’instance appropriée de la dimension Utilisateur (i.e. les tables de faits en lien Regular avec les UO se retrouvent alors en lien M2M avec l’instance de dimension UtilisateurUO à travers le groupe de mesure basé sur FactlessDroitsUniteOrganisationnelle).

Et côté rôles…

On se retrouve alors à sécuriser la dimension Utilisateur (pas les instances ou CubeDimensions, la Shared Dimension). ce qui descend la sécurité sur toutes les instances. On utilise alors une sécurité basée sur UserID (ou CustomData si on est dans un système différent).

Exists
(
   [Dimension à Sécuriser].[Attribut Clé].Members,
   StrToMember("[User].[User Name].&["+UserName()+"]"),
   "Factless Securité"
)

Conclusion

Cette solution de sécurité, que j’ai déjà implémenté avec un succès certain, n’a finalement comme inconvénient que de rajouter un certain nombre de tables. Elle est en revanche relativement transparente et assez facile à administrer, et est surtout simplissime à gérer côté SSAS?
A noter qu’une foultitude d’autres solutions existent, et que le codage d’une extension en .NET pour gérer la sécurité, s’il est dangereux car appliqué à chaque requête, peut parfaitement être considéré comme une approche robuste.

2 réflexions sur “Sécurité dynamique avec une Factless

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s