Quand on déploie des cubes Mondrian dans Pentaho, on est bien souvent amené à gérer des droits d’accès sur une ou plusieurs dimensions d’un cube : par exemple pour un cube des ventes, ne permettre aux responsables commerciaux de visualiser uniquement les chiffres d’affaires concernant les zones dont ils ont la charge.

Cette opération de sécurisation d’accès aux données s’effectue assez simplement, via l’ajout d’attributs dans le schéma XML du cube, et ceci pour chaque rôle à filtrer, par exemple :

Cette sécurisation d’accès aux données fonctionne bien, mais montre rapidement ses limites dès que :

  1. le nombre de rôles devient important
  2. l’affectation des utilisateurs à ces rôles évolue souvent

Dans ces 2 cas, il devient alors très contraignant d’appliquer la sécurité car celle-ci nécessite obligatoirement une définition en dur dans le schéma XML

Comment donc procéder dans ce type de situation ?

Réponse : grâce à la sécurisation dynamique du schéma Mondrian offerte par le « Dynamic Schema Processor » (DSP)

# Sécurisation dynamique du cube SteelWheels

Nous prendrons comme exemple l’adaptation du cube « SteelWheels » fourni dans la plate-forme Pentaho de démo (pré-requis : Pentaho 4.8 CE + plugin Saiku).

L’objectif est de pouvoir sécuriser dynamiquement les pays en fonction de qui se connecte.

Dans mon exemple, on sécurise les pays pour Joe, Suzy, Pat et Tiffany comme indiqué dans les codes couleurs ci-dessous :

DSP-pic1

# Etape 1 – Stockage des habilitations

La façon la plus souple de conserver les droits d’accès, c’est encore une base de données. Ainsi les liens Utilisateur <=> Pays sont stockés dans une table « USER_FILTER » créée spécifiquement dans la base SampleData et chargée avec le traitement Kettle ci-dessous :

DSP-pic2

# Etape 2 – Chargement des pays autorisés pour l’utilisateur

Une Xaction « set_session_vars.xaction » est créée, celle-ci permet de charger dans la session utilisateur la liste des pays autorisés. Cette Xaction charge en session (lors de la connexion de l’utilisateur à la PUC) la variable USER_COUNTRY, à savoir une chaine de caractère correspondant à la concaténation des pays accessibles et qui sera utilisée ultérieurement dans la clause « WHERE COUNTRY IN » d’un ordre SQL.

Ci-dessous la requête SQL sur la table user_filter permettant de récupérer la liste des pays autorisés en fonction de l’identifiant utilisateur (via le paramètre {login}) :

DSP-pic2b

Une fonction javascript permet d’instancier la variable USER_COUNTRY, via la concaténation de tous les pays retournés :

# Etape 3 – Activation automatique de « set_session_vars.xaction »

Afin que cette Xaction soit déclenchée automatiquement à la connexion, il faut ajouter les lignes ci-dessous dans le fichier /pentaho-solutions/system/sessionStartupActions.xml

L’Xaction « get_session_vars.xaction » permet de vérifier la valeur de USER_COUNTRY après la connexion de chaque utilisateur.

  • pour Joe :

DSP-pic3

  • pour Pat :

DSP-pic4

# Etape 4 – Adaptation du schéma XML Mondrian

Une partie du schéma XML Mondrian doit être adaptée (/pentaho-solutions/steel-wheels/analysis/steelwheels.mondrian.xml)

On remplaçe ainsi la définition en dur de la table CUSTOMER_W_TER :

par un ordre SQL prenant dans sa clause WHERE … IN le paramètre %USER_COUNTRY % :

# Etape 5 – Création d’une classe Java pour la mise à jour dynamique du schéma Mondrian

Un code Java permet de remplacer dynamiquement dans le schéma les informations contenues dans USER_COUNTRY. Celui-ci implémente la classe DynamicSchemaProcessor et doit être compilé puis exporté sous forme de jar dans le répertoire biserver-cepentaho-solutionssystemsaikulib

# Etape 6 – Configuration Saiku

Afin que Saiku affecte bien un cache dédié à chaque utilisateur, la modification suivante doit être effectuée.

Mettre la valeur true pour le paramètre userAware dans le fichier plugin.spring.xml

# Etape 7 – Mise à jour du catalogue

Configurer la datasource dans le fichier /system/olap/datasources.xml comme suit, afin de spécifier l’utilisation d’un DSP :

# Télécharger l’exemple :

Cet exemple est issu d’une configuration dynamique effectuée chez un de nos clients (Ministère de l’Agriculture) sur plus d’une centaine de rôles.

Vous pouvez télécharger l’ensemble des fichiers décrits ci-dessus dans cette archive.

Pour encore plus de souplesse, vous pouvez aussi vous appuyer sur les rôles Pentaho (au lieu des identifiants utilisateurs) à l’aide de la variable PrincipalRoles !