Sites


Lutece : guide développeur

L'authentification Front Office (MyLutece)

Plusieurs API ont été mises en place à partir de la version 1.1 de Lutèce pour gérer la sécurité des accès aux ressources du portail. La principale mise en oeuvre est faite par le plugin MyLutece qui réalise de manière modulaire l'authentification et la gestion des rôles associés aux utilisateurs authentifiés du site. L'objectif de cette API est de fournir une authentification unique des utilisateurs partagée par tous les plugins d'un site. Ceci signifie que toute application du portail pourra vérifier que l'utilisateur courant est identifié et accéder à ses rôles.

Outre l'authentification des utilisateurs, ces API permettent la réalisation d'applications basées sur des rôles : espaces privés, personnalisation, préférences, rôles applicatifs, ...

API des modules d’authentification

La gestion de l’authentification est modulaire et paramétrable, de manière à supporter plusieurs implémentations dont voici une liste non exhaustive :

  • Annuaire LDAP (LDAPAuthentication )
  • Base de données interne (BaseAuthentication )
  • Authentification déléguée au serveur Web (ex: Tomcat)
  • OpenID connect
  • Persona (Mozilla)
  • FranceConnect (DISIC)
  • OpenAM (ForgeRock)
  • CAS(Jasig)

L’ensemble des implémentations doit respecter l’interface fr.paris.lutece.portal.service.security.LutecePortalAuthentication .

On distingue deux sous-ensembles d’implémentations :

  • l’authentification est assurée au niveau de Lutece.
  • l’authentification est réalisée en amont de Lutece (ex : serveur web ou WSSO).

Une authentification assurée par Lutece a les caractéristiques suivantes :

  • elle doit prévoir des méthodes de connexion/déconnexion (login / logout ).
  • elle spécialise la classe abstraite fr.paris.lutece.plugins.mylutece.authentication.PortalAuthentication .

Une authentification basée sur un système d'authentification en amont disposera quant à elle des caractéristiques suivantes :

  • elle ne doit pas prévoir des méthodes de connexion /déconnexion puisque celles-ci sont assurées par le dispositif externe situé en amont.
  • elle spécialise la classe abstraite fr.paris.lutece.plugins.mylutece.authentication.ExternalAuthentication .

API des utilisateurs et gestion des comptes

A chaque système d’authentification peut être associé un modèle d’utilisateur qui doit implémenter le modèle minimal défini par l’interface fr.paris.lutece.portal.service.security.LuteceUser .

Les implémentations notamment prévues sont :

  • LDAPUser
  • BaseUser

Ces implémentations ne font pas partie du noyau, elles sont disponibles dans le plugin "mylutece" sous le package fr.paris.lutece.plugins.mylutece.modules.* .

La façon dont ces modèles d’utilisateurs délivrent les informations concernant l’utilisateur se rapproche du modèle proposé par la spécification JSR 168, basée elle-même sur celle de la Platform for Privacy Preferences 1.0 réalisée par le W3C. Ainsi les noms et prénoms se récupèrent à partir des clés user.given.name et user.given.family.

Les mêmes noms d'attributs sont proposés par les OASIS Web Services for Remote Portlets Technical Committee. Voir la liste des attributs.

Concernant la gestion des comptes des utilisateurs, plusieurs modes sont possibles :

  • l’utilisateur ne peut pas créer lui-même un compte. La création du compte doit alors être réalisée au niveau de l’annuaire soit par une fonction d’administration intégrée à Lutece soit par un dispositif autre.
  • l’utilisateur peut se créer un compte sans nécessiter l’intervention des administrateurs du site. Dans cette situation, l’écran de login affichera un lien vers la page de création d’un nouveau compte.

Dans les deux situations, il sera possible pour l’utilisateur identifié d’accéder à une page optionnelle et paramétrable permettant de visualiser les informations du compte. A partir de cette page et en fonction des choix de gestion des comptes il est envisageable d’ajouter des fonctions de changement de mot de passe ou de modification des informations personnelles.

Concernant les rôles associés aux utilisateurs, ils correspondent à la description faite dans la spécification Java Servlet 2, c’est à dire une notion abstraite définie par une application qui, associée à un utilisateur ou à un groupe d’utilisateur, permet de définir une politique de sécurité.

Remarque importante : selon le système d’authentification utilisé, l’accès à l’ensemble des rôles n’est pas toujours possible. Par exemple, le système d’authentification basé sur le serveur web ne permet que de vérifier qu’un utilisateur dispose bien d’un rôle donné par le biais de la méthode isUserInRole , mais la liste des autres rôles n’est pas accessible.

Le Service de sécurité du noyau : SecurityService

Ce service est le point d’entrée pour tous les composants : plugins, portlets ou applications désirant obtenir l’identité de l’utilisateur courant.

La principale méthode à utiliser est getRegisteredUser qui permet d’obtenir l’identité de l’utilisateur courant enregistré au niveau du portail.

Une nouvelle exception UserNotSignedException a été ajoutée à la signature des méthodes getPage des interfaces ContentService et XPageApplication , afin de signifier que l’utilisateur doit être authentifié pour accéder au service ou à l’application. Cette exception est catchée par la page principale du site, Portal.jsp . Celle-ci enregistre les paramètres courants de l’url, redirige l’utilisateur vers la page de login paramétrée dans le fichier mylutece.properties . Une fois l’identification réalisée, l’utilisateur est redirigé vers l’url à laquelle il tentait d’accéder initialement :

     LuteceUser user = SecurityService.getInstance().getRegisteredUser( request );

     if( user != null )
     {
           // The user is authenticated
           ...
     }
     else
     {
          // Throw an exception to force the user to login
          throw new UserNotSignedException();
     }

A l’instar des interfaces HttpServletRequest ou PortletRequest (JSR 168), SecurityService propose également les méthodes getRemoteUser , getUserPrincipal et isUserInRole .

Mise en oeuvre

Paramétrage de l’authentification : Installation du plugin mylutece

Le plugin doit être déployé comme n’importe quel plugin. 

Paramétrage du plugin mylutece

Les paramètres décrivant l’implémentation choisie sont définis dans le fichier de configuration mylutece.properties de Lutece grâce aux propriétés suivantes :

########################################################
# Authentication management
mylutece.authentication.enable=true
mylutece.authentication.class=fr.paris.lutece.plugins.mylutece.authentication.MultiLuteceAuthentication

Description des propriétés :

  • lutece.authentication.enable : indique si le service d'authentification doit étre activé ou non(obligatoire)
  • lutece.authentication.class : détermine la classe qui implémente l’authentification choisie (à renseigner si lutece.authentication.enable a la valeur true ).

Les objets de base du système

L’écran d’identification par défaut

Dans le cas d’une identification interne au portail, le plugin MyLutece propose une page d’identification par défaut :

Cette page est accessible à partir de l’adresse : http://myhost/lutece/jsp/site/Portal.jsp?page=mylutece&action=login.

Son adresse et celle du traitement du formulaire d’identification sont paramétrées dans le fichier mylutece.properties comme suit :

 mylutece.url.login.page=Portal.jsp?page=mylutece&action=login
 mylutece.url.doLogin=./plugins/mylutece/DoMyLuteceLogin.jsp

Le portlet d’identification

Le plugin MyLutece propose un portlet d’identification.

Lorsque l’utilisateur n’est pas identifié et que le système d’authentification est de type Portail et non externe, le portlet affiche le formulaire de connexion login/password avec des liens facultatifs vers une page de création d’un compte ou de récupération d’un mot de passe oublié.

Une fois l’utilisateur identifié, le portlet affiche un message de bienvenue ainsi que le bouton de déconnexion.

Les pages par défaut de gestion du compte

Les pages par défaut concernant la gestion de compte disponibles dans le plugin MyLutece sont les suivantes :

  • création d’un nouveau compte
  • affichage des informations personnelles
  • mot de passe perdu

Les implémentations proposées ne sont pas opérationnelles. Si de telles fonctions de gestion de compte sont à mettre en place, il faudra réaliser une XPageApp ou des JSP pour permettre leur implémentation.

Les fonctions telles que le changement de mot de passe ou la modification des informations personnelles peuvent être implémentées de la même manière et leur accès est à prévoir au niveau de la page d’affichage des informations personnelles.

Le paramétrage des URL de ces fonctions est réalisé dans le fichier mylutece.properties . L’exemple suivant montre le paramétrage d’une implémentation réalisée avec une XPageApp nommée account_manager :

mylutece.url.createAccount.page=Portal.jsp?page=account_manager&action=createAccount
mylutece.url.viewAccount.page=Portal.jsp?page= account_manager&action=viewAccount
mylutece.url.lostPassword.page=Portal.jsp?page= account_manager&action=lostPassword

Contrôle de l’authentification pour les applications

Il est possible de soumettre l'ensemble des accès au portail à une authentification. Dans ce cas de figure, aucune page ou application n'est accessible à un utilisateur non identifié.

Pour mettre en oeuvre ce mode de fonctionnement il faut activer le filtre d'authentification apporté par le plugin mylutece, en se rendant dans le menu "configuration du filtre d'authentification" dans le back office de Lutece.

Application de test de l'authentification : Plugin MyLuteceTest

Un plugin mylutecetest a été réalisé pour tester et illustrer le comportement d’une application dont l’accès est restreint. Cette application affiche :

  • le nom du service d'authentification utilisé.
  • les informations disponibles concernant l'utilisateur : clés UserInfo par défaut et clés spécifiques (voir exemple ci-dessous)
  • les rôles éventuellement possédés par l'utilisateur.

Il y a une erreur de communication avec le serveur Booktype. Nous ne savons pas actuellement où est le problème.

Vous devriez rafraîchir la page.