Ajout d'attributs calculés
EoleSSO permet de définir des attributs calculés en plus des données récupérées dans l'annuaire à la connexion de l'utilisateur. Ces attributs sont calculés par des fonctions écrites en langage Python et ayant accès aux attributs connus de l'utilisateur.
Pour ajouter un attribut calculé, créer un fichier <nom_attribut>.py
dans le répertoire /usr/share/sso/user_infos/
:
# -*- coding: utf-8 -*-
use_cache = True
... imports et fonctions utilitaires pour le calcul ...
def calc_info(user_info):
.....
return valeur_attributs
use_cache
est une directive spécifiant si l'attribut doit être mis en cache (voir Optimisation des attributs calculés) ;user_info
est le dictionnaire des données existantes, il est passé automatiquement à la fonction par le serveur SSO ;
valeur_attributs
peut êtreune liste Python contenant les valeurs à associer à l'attribut <nom_attribut> :
return [val1, val2, ...]
un dictionnaire Python dont les clés sont le nom de champ et les valeurs la liste de valeurs associées (calcul d'attributs multiples) :
return {'attribut1' : [val1, val2, ...], 'attribut2' : [val1, val2, ...], ...}
Pour que ces données soient envoyées aux applications clientes du service EoleSSO, il faut les assigner dans un filtre de données (cf. paragraphes suivants)
Nom de l'attribut retourné
Dans le cas ou une simple liste de valeur est retournée, c'est le nom du fichier qui détermine le nom d'attribut auquel seront assignées les valeurs (nom du fichier sans l'extension .py
).
Dans le cas du calcul d'attributs multiples, le nom de fichier n'est pas pris en compte , le nom de l'attribut est indiqué directement dans la structure retournée.
Données à disposition des fonctions de calcul
L'objet user_infos
est un dictionnaire Python contenant les informations connues sur l'utilisateur (récupérées au moment de sa connexion). Il contient les informations suivantes :
- tous les champs de l'utilisateur dans l'annuaire LDAP qui sont accessibles par lui en lecture, à l'exception des mots de passe. Comme c'est le cas dans l'annuaire, les valeurs des attributs sont multivaluées. Par exemple, pour récupérer la première valeur du champ mail, utiliser
user_infos['mail'][0]
; - une entrée
user_groups
qui contient la liste des groupes Samba auxquels l'utilisateur est inscrit (récupérée également dans l'annuaire) ; - une entrée
info_groups
contenant un dictionnaire dont les clés sont l'attributcn
des groupes présents dansuser_groups
et les valeurs sont les attributs du groupe correspondant dans l'annuaire LDAP. Seuls les attributs suivants sont conservés :sambaGroupType
,displayName
,cn
,objectClass
,gidNumber
,mail
,description
etniveau
; - une entrée
dn
contenant le DN complet de l'utilisateur (utilisé pour récupérer le RNE d'origine d'un utilisateur dans le cas d'un annuaire multi-établissements) ; - les entrées
rne
etnom_etab
qui correspondent aux informations présentes dans la configuration Creole du serveur (ou dans le fichier de configuration du serveur EoleSSO le cas échéant) ; - au fur et à mesure du calcul des attributs, ceux déjà traités sont rendus disponibles dans
user_infos
.
Ordre de traitement et mise à disposition des attributs
2 règles s'appliquent pour déterminer dans quel ordre les attributs calculés sont évalués :
- Les fichiers sont traités par ordre de tri alphanumérique sur le noms des fichiers. Si un attribut dépend d'un autre, il est recommandé de préfixer le nom de fichier par un numéro (par exemple
00_attribut1.py
,01_attribut2.py
si attribut2 doit récupérer la valeur d'attribut1) ; - Les fichiers renvoyant les valeurs d'un seul attribut (renvoi de liste) sont prioritaires sur celles renvoyant des attributs multiples (renvoi de dictionnaire, même si celui-ci contient un seul attribut). Cela permet par exemple de disposer d'un ensemble d'attributs renvoyés par une seule fonction, puis d'écraser au cas par cas certains attributs si des adaptations sont nécessaires d'un serveur à l'autre (ou de redéfinir un des attributs comme non mis en cache).
Truc & astuceOptimisation des attributs calculés
Toutes les fonctions présentes sont calculées lors de la création de la session d'un utilisateur et lorsqu'une application accède aux informations de l'utilisateur.
Pour éviter de surcharger le serveur EoleSSO lors de requêtes multiples, les attributs peuvent être mis en cache pour la durée de la session SSO de l'utilisateur. Pour qu'un attribut utilise ce cache, il faut ajouter la ligne suivante dans le fichier de calcul :
use_cache = True
Il est conseillé d'utiliser cette directive sur tous les attributs, sauf ceux dont la valeur doit être ré-évaluée durant la session de l'utilisateur.
Attention
Dans le cas d'une utilisation du produit EoleSSO hors du cadre de la distribution EOLE, certains attributs peuvent ne pas être disponibles (en fonction de l'organisation des données dans l'annuaire). Certaines informations comme le libellé de l'établissement ou son code RNE peuvent être renseignées dans le fichier de configuration principal du serveur : /usr/share/sso/config.py
.
En plus des données ci-dessus, un certain nombre d'attributs calculés sont livrés par défaut par le serveur :
classes
: la classe d'un élève ou les classes d'un professeur (livré pargroupes.py
) ;disciplines
: les matières enseignées pour un professeur (livré pargroupes.py
) ;niveaux
: le niveau (attributMefclf
) d'un élève ou les niveaux dans lesquels un professeur enseigne (livré pargroupes.py
) ;secureid
: identifiant opaque calculé avec un MD5[1] de l'UID et du RNE de l'utilisateur ;ENTPersonProfils
: renvoie le profil de l'utilisateur tel que défini dans le SDET (par ex. National_1 pour un élève) ;ENTPersonStructRattachRNE
: le numéro d'établissement d'origine de l'utilisateur, calculé à partir de son DN dans l'annuaire (utile dans le cas d'un annuaire centralisé regroupant plusieurs établissements) ;ecs_profil
etecs_rne
: version spécifique des 2 attributs précédents (applications xDesktop et eConnect, voir le site http://envole.ac-dijon.fr) ;entlogin
: renvoie l'attributENTPersonProfil
de l'utilisateur. Si ce champ n'est pas renseigné, l'équivalent desecureid
est renvoyé.
ExempleAttribut calculé secureid (identifiant unique et opaque à destination de services externes)
Contenu du fichier /usr/share/sso/user_infos/secureid.py
:
# -*- coding: utf-8 -*-
def calc_info(user_infos):
"""calcule secureid : identifiant crypté unique pour chaque utilisateur"""
from md5 import md5
# calcul d'un identifiant crypté unique
user_hash = md5("%s@%s" % (user_infos['uid'][0], user_infos['rne'][0]))
return [user_hash.hexdigest()]