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/ :

1
# -*- coding: utf-8 -*-
2
3
use_cache = True
4
5
... imports et fonctions utilitaires pour le calcul ...
6
									
7
def calc_info(user_info):
8
    .....
9
    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 être

    • une 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'attribut cn des groupes présents dans user_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 et niveau ;
  • 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 et nom_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é par groupes.py) ;
  • disciplines : les matières enseignées pour un professeur (livré par groupes.py) ;
  • niveaux : le niveau (attribut Mefclf) d'un élève ou les niveaux dans lesquels un professeur enseigne (livré par groupes.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 et ecs_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'attribut ENTPersonProfil de l'utilisateur. Si ce champ n'est pas renseigné, l'équivalent de secureid est renvoyé.

ExempleAttribut calculé secureid (identifiant unique et opaque à destination de services externes)

Contenu du fichier /usr/share/sso/user_infos/secureid.py :

1
# -*- coding: utf-8 -*-
2
							
3
def calc_info(user_infos):
4
    """calcule secureid : identifiant crypté unique pour chaque utilisateur"""
5
    from md5 import md5
6
							
7
		# calcul d'un identifiant crypté unique
8
		user_hash = md5("%s@%s" % (user_infos['uid'][0], user_infos['rne'][0]))
9
10
		return [user_hash.hexdigest()]