Utilisation d'un SSO dans eZ Publish

Parfois, lors du développement d'une application web, il est nécessaire de s'interfacer avec le ou les logiciels et/ou sites web du client afin de garder une session commune et cohérente au sein de sa bulle applicative. Pour ce faire, il est souvent utile de faire appels à un outil : le SSO (Single Sign On), ou Authentification Unique . Ce genre d'outils est assez répandu sur la toile; on en trouve notamment chez Google (un seul compte pour toutes leurs applications), Canal+, M6, etc...

Mise en oeuvre d'un SSO Handler

Le principe de ce type de handler est simple, dans la mesure où il suffit de développer, au sein d'une extension une classe implémentant la méthode handleSSOLogin(). À noter que je pars du principe que vous savez comment développer une extension de base. Si tel n'est pas le cas, vous pouvez vous référer à cet excellent article expliquant les bases du développement d'une extension eZ Publish .

Déclaration du handler

Dans le répertoire settings/ de votre extension (que je nommerai jvsso), créez une surcharge de site.ini pour votre siteaccess. Vous pouvez également créer la surcharge directement sous settings/, ce qui aura pour effet de rendre le handler SSO pour tous les siteaccess de votre instance eZ Publish.

Dans votre surcharge site.ini.append.php, effectuez la déclaration suivante :

<?php /* #?ini charset="utf-8"?
 
[UserSettings]
ExtensionDirectory[]=jvsso
SingleSignOnHandlerArray[]=Lolart
 
*/
?>

Nous déclarons ici que l'extension jvsso doit être prise en considération par le système d'identification utilisateur, et que cette extension contient un SingleSignOnHandler appelé Lolart. Vous aurez par ailleurs noté que le nom du handler SSO est contenu dans un tableau, ce qui signifie qu'il est possible d'en déclarer plusieurs, appelés successivement jusqu'à ce qu'une identification réussisse (pour les curieux, jetez un coup d'oeil à la classe eZUser - kernel/classes/datatypes/ezuser/ezuser.php - autour de la ligne 1150 pour voir comment eZ Publish effectue ses appels).

Développement de la classe PHP

Dans le répertoire de votre extension, créez un dossier sso_handler/. Ce dossier est destiné à contenir la classe qui PHP que nous allons développer. Le nom du fichier PHP et le nom de la classe sont soumis aux conventions suivantes :

  • Le fichier PHP doit se nommer ez<nom_du_handler_minuscules>ssohandler.php. Cela donne donc pour nous : ezlolartssohandler.php.
  • La classe PHP doit se nommer eZ<nom_du_handler>SSOHandler, ce qui donne eZLolartSSOHandler.

Notre classe PHP doit à minima implémenter la méthode handleSSOLogin(). Cette méthode doit retourner un utilisateur eZ Publish valide (objet eZUser) ou false en cas d'échec.

<?php
    class eZLolartSSOHandler
    {
        public function __construct()
        {
         // Effectuez ici des instructions d'initialisation de votre handler
        }
 
        /**
         * Retournez un objet eZUser a loguer dans eZ Publish
         * Si l'authentification echoue, retournez false
         */
        public function handleSSOLogin()
        {
            $currentUser = false; // Valeur par defaut que l'on retourne si l'authentification echoue
 
            // Effectuez ici toutes les taches vous permettant d'identifier votre utilisateur
            // Dans tous les cas, vous devrez retourner un utilisateur eZ Publish valide ou false
            // L'utilisateur doit donc etre cree le cas echeant
 
            return $currentUser;
        }
    }

Et voilà ! Il ne reste plus qu'à activer notre extension et à vider nos caches INI !

Conclusion

Cette fonctionnalité, pourtant très utile et présente dans le kernel depuis un certain temps, reste souvent méconnue de la plupart des développeurs. Selon moi, c'est ce genre de choses qui font d'eZ Publish un outil complet et vraiment professionnel. Il existe malheureusement peu de documentation officielle sur ce type d'éléments "cachés".

À bon entendeur ;-)


Commentaires

SSO avec LemonLDAP (par alex)

bonjour,

as tu deja regardé et connecté le systeme lemonldap avec Ez ?

Alexandre


Re: LemonLDAP (par Jérôme Vieilledent)

Salut Alex

Non, je n'ai jamais eu l'occasion de travailler avec ce système...


A bon entendu.. (par Nicolas)

Roger Houston, message reçu.

Très bon article, encore une fois. Ceci ne devrait-il pas occasionner une publication sur le portail communautaire ? Une petite traduction en anglais, et ce billet pourrait devenir une base documentaire pour le système de SSO, en attendant que la feature soit officiellement documentée.

Qu'en penses tu Jérôme ?


Publication sur le portail communautaire (par Jérôme Vieilledent)

Merci !
J'en pense que je suis d'accord
Je t'avoue que j'y avais pensé, mais j'ai préféré publier d'abord en français ici car j'ai le sentiment qu'on manque de ressources en français...
Tout le monde a-t-il les droits pour publier un article sur http://share.ez.no ?


Problème résolu (par Benoît)

Excellent article ! J'essayais justement de comprendre le fonctionnement des paramètres SessionNamePerSiteAccess et SessionNameHandler, mais voilà une solution à mon problème de siteaccess multiple qui me plait d'avantage.

Merci bien et bonne continuation !


Traduction (par Peter Keung)

Je pourrais aider avec le traduction si vous voulez.