Personnaliser l'authentification ZOPE avec Cookie Crumbler

Benoît Martiré

Cookie Crumbler est une extension à ZOPE qui permet de gérer l'authentification forte de ZOPE et la création automatique d'un cookie pour la persistance de l'authentification durant la session utilisateur. Il permet de remplacer la boite de dialogue standard d'authentification dans ZOPE.
Commentez

- Titre : Personnaliser l'authentification ZOPE avec Cookie Crumbler

- Auteur : Benoît Martiré

- Parution : 24 avril 2011

- Licence : Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright ® 2011 Benoît Martiré. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- 1. Introduction

- 2. Installation de Cookie Crumbler

- 3. Mise en place minimale

- 4. Passons à l'action

- 5. Allons plus loin !

- 6. Pour terminer

- 7. Conclusion

- 8. Liens utiles

- 9. Remerciements

1 - Introduction

Cet article n'est pas destiné à devenir un document de référence. Il n'est pas non plus destiné aux développeurs expérimentés de ZOPE. Cet article est plutôt destiné à toute personne désirant obtenir un minimum d'aide et de compréhension sur le sujet.

2 - Installation de Cookie Crumbler

L'installation de Cookie Crumbler est très simple puisque c'est un produit ZOPE. Il suffit donc de télécharger l'archive ici.

Une fois téléchargée, vous décompressez l'archive dans un répertoire, puis copiez le dossier « CookieCrumbler » dans le répertoire « Products » de votre instance de ZOPE.

Ensuite, vous redémarrez votre instance ZOPE.

Une fois l'instance relancée, vous devez avoir dans la liste des produits disponibles, le choix « Cookie Crumbler ».

3 - Mise en place minimale

Voilà, tout est prêt pour utiliser Cookie Crumbler.

Le principe de Cookie Crumbler est qu'il gère l'interface d'authentification par rapport à l'acl_users le plus proche de lui dans l'arborescence (principe de l'acquisition ZOPE).

Donc nous allons commencer par créer un folder et un nouvel acl_user (User folder) qui vous serviront pour la mise en œuvre de Cookie Crumbler.

Créez un Folder « testCookieCrumbler » en cochant l'option « Create public interface » et « Create user folder ».

* Nota : pour la suite, même si cela n'est pas précisé, lors de la création d'un folder, vous cocherez l'option « Create public interface ».

Rendez-vous dans le nouveau « acl_users » contenu dans le folder « testCookieCrumbler » et créez deux utilisateurs.

L'un des utilisateurs a le rôle « Manager », et l'autre n'a aucun rôle.

Créez maintenant les éléments du Cookie Crumbler. Ajoutez un Cookie Crumbler dans le folder « testCookieCrumbler ».

Ne changez rien aux paramètres par défaut.

Vous obtenez dans votre Cookie Crumbler « login » les éléments ci-dessous.

Vous constatez que le Cookie Crumbler « login », contient des Dtml-methods. À ce stade, vous pouvez tester le Cookie Crumbler en cliquant sur l'onglet « view ».

Vous êtes en présence du formulaire standard d'authentification mis à disposition par Cookie Crumbler.

Quel mécanisme permet d'appeler ce formulaire ?

En fait, il ne sert à rien depuis votre site de faire explicitement appel à ce formulaire.

ZOPE va s'en charger pour vous.

Explication :

Lorsque vous souhaitez créer un site dont l'accès est soumis à authentification, il vous suffit de définir la sécurité à appliquer sur telle ou telle partie de votre site. Le mécanisme d'authentification sera déclenché par ZOPE dans le cas où un utilisateur essaie d'accéder à une partie qu'il n'est pas autorisé à voir.

4 - Passons à l'action

Créez un nouveau folder « monSite » dans le folder « TestCookieCrumbler ».

Rendez-vous dans ce folder et cliquez sur l'onglet « Security ».

Actuellement, le folder hérite de la sécurité de son parent. Nous allons modifier cette partie pour ne permettre qu'aux utilisateurs authentifiés (Authenticated) d'accéder au contenu de ce folder.

Dans le tableau listant les sécurités cliquez sur « Authenticated ».

Sélectionnez l'ensemble des items dans le menu déroulant, et cliquez sur « Save_change ».

Si vous constatez après cela que d'autres sécurités ont été déclarées pour d'autres rôles, il faut les supprimer. Dans mon cas, la sécurité est déclarée pour le rôle Manager, mais aussi pour Acquire permission settings.

Nous devons nous assurer de deux choses :

1 - supprimer les droits pour le manager ;

2 - supprimer les droits hérités du parent.

Pour cela vous cliquez sur Manager, puis vous désélectionnez l'ensemble des items et sauvegardez.

Répétez la même opération pour Acquire permission settings.

Explications :

Nous venons de mettre en place la structure minimum de notre site internet. Cependant notre site internet ne sera accessible qu'aux personnes authentifiées. Sinon, tout autre visiteur sera refusé.

Testons tout de suite ce que nous venons de faire.

Nota : Comme vous êtes déjà authentifié dans votre navigateur actuel (sinon vous n'auriez pas accès à votre ZOPE Management), je vous conseille d'utiliser un autre navigateur pour effectuer vos tests. En effet, ceci évite de se déconnecter et se reconnecter à l'interface de ZOPE à chaque modification de code.

Donc dans un autre navigateur web, tapez l'adresse d'accès à votre site.

>> http://localhost:8080/cookBook/TestCookieCrumbler/monSite

Tout de suite, vous êtes redirigé vers la page d'authentification (mise en place avec Cookie Crumbler).

Maintenant en saisissant un login/password valide, vous arrivez sur la page index_html située dans le dossier « monSite ».

Que s'est-il passé ?

Le mécanisme est simple, lors de votre demande d'accès à notre site, http://localhost:8080/cookBook/TestCookieCrumbler/monSite, Cookie Crumbler déclenche le mécanisme de contrôle d'accès de ZOPE. Là, il constate que seuls les utilisateurs « Authentifiés » sont autorisés à accéder à la page demandée. Alors, Cookie Crumbler se substitue à la fenêtre de demande d'authentification standard de ZOPE.

À la place, Cookie Crumbler, fournit une page HTML, qui permet de gérer l'authentification. C'est la page login_form contenue dans le Cookie Crumbler qui est utilisée pour la demande d'authentification.

Cette page est un bête formulaire, qui se contente de pointer vers la page que l'utilisateur authentifié doit voir. Le mécanisme de vérification de l'authentification se répète tant qu'il n'aboutit pas (tant qu'il y a échec d'authentification).

Il faut bien comprendre que la vérification par ZOPE des droits d'accès aux ressources d'un site est permanente et transparente.

En effet, chaque requête, d'un utilisateur pour accéder à tout ou une partie d'un site déclenche le contrôle de sécurité par ZOPE. Si l'utilisateur ne remplit pas les conditions requises pour accéder à une ressource, ZOPE déclenche une demande d'authentification.

Le concept est très intéressant puisque le développeur du site peut de façon très simple implanter des contrôles d'accès en modifiant simplement la sécurité des ressources, ou en créant de nouveaux rôles, etc.

5 - Allons plus loin !

Vous allez continuer votre découverte de Cookie Crumbler en implantant dans votre site une partie accessible à un utilisateur ayant le rôle de Manager uniquement.

(Par extension, à un utilisateur authentifié, ayant le rôle Manager.)

Dans le folder monSite, vous créez un autre folder (avec une public interface), que vous appelez « private ».

Vous allez ensuite modifier la sécurité de ce folder pour qu'il ne soit accessible qu'à un utilisateur ayant le rôle Manager.

Testons !

Fermez le navigateur qui vous permet de faire vos tests pour réinitialiser la session.

Rouvrez-le et essayez d'accéder à l'espace « private » de votre site.

http://localhost:8080/cookBook/TestCookieCrumbler/monSite/private

Vous voyez que vous êtes redirigé vers la page d'authentification.

Commencez par saisir l'identifiant et mot de passe de l'utilisateur qui n'a pas le rôle Manager.

Vous constatez que vous êtes redirigé vers la page d'authentification, puisque l'utilisateur n'a pas l'autorisation d'accéder à cette partie du site. Il n'a pas le rôle « Manager ».

Répétez l'opération, en saisissant cette fois le login et password de l'utilisateur ayant le rôle Manager.

Cette fois-ci vous êtes dirigé vers la page index_html du folder « private ».

Vous venez de voir comment vous pouvez créer des espaces réservés au sein d'un même site, sans avoir à mettre en place tout un mécanisme complexe de vérification d'autorisation, de redirection, d'authentification…

6 - Pour terminer

La mise en place de l'authentification via Cookie Crumbler permet d'intégrer complètement le formulaire d'identification dans notre site internet, et de pouvoir modifier son aspect en fonction de la charte graphique de notre projet.

Cependant, qui dit mécanisme d'authentification, dit déconnexion.

Vous allez voir comment procéder pour déconnecter un utilisateur authentifié.

Éditez le fichier index_html contenu dans le folder « monSite ». Nous allons y placer plusieurs éléments qui vont vous permettre de vérifier ce que nous avons fait précédemment et en plus de pouvoir déconnecter l'utilisateur.

Voici le code HTML tel qu'il est dans le fichier généré par ZOPE.

HTML

<html>
<head>
<title tal:content="template/title">The title</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>
<h2><span tal:replace="here/title_or_id">content title or id</span>
<span tal:condition="template/title"
tal:replace="template/title">optional template title</span></h2>
This is Page Template <em tal:content="template/id">template id</em>.
</body>
</html>

Remplacez-le par le code suivant.

HTML

<html>
<head>
<title tal:content="template/title">The title</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
</head>
<body>
<div tal:content="python:'bonjour %s' %request.AUTHENTICATED_USER.getUserName()"></div>
<hr>
<div tal:content="structure request"></div>
<hr>
<form method="post" action="login/logged_out">
<input type="submit" value="deconnexion">
</form>
</body>
</html>

Ce nouveau code contient trois parties.

La première permet d'identifier l'utilisateur authentifié. En effet, lorsqu'un utilisateur accède à votre site, qu'il soit authentifié ou non, un objet User est créé pour la session. Cet objet stocké dans l'objet Request, a des propriétés et méthodes. L'une d'elles, getUserName() retourne le nom de l'utilisateur.

La deuxième vous montre le contenu de l'objet REQUEST. Ce qui nous importe ici est de voir ce qui est inscrit en face de « AUTHENTICATED_USER ».

Vous devriez avoir quelque chose comme

>> AUTHENTICATED_USER<User 'ben'>

<User 'ben'> (ben dans mon cas est le nom de mon utilisateur) est un objet de type User.

Cet objet encapsule nombre de propriétés et méthodes permettant de manipuler et utiliser ce User.

(cf : http://localhost:8080/Control_Panel/Products/OFSP/Help/AuthenticatedUser.py pour plus de détails sur cet objet particulier de ZOPE).

Enfin la troisième partie est un formulaire qui comporte un simple bouton de déconnexion.

Le formulaire pointe vers un fichier automatiquement créé par Cookie Crumbler. Cependant ce fichier ne correspond pas à ce que je désire mettre en place comme comportement lors de ma déconnexion.

En effet, ce que je veux faire ici c'est déconnecter l'utilisateur et qu'il se retrouve devant la page de connexion.

Pour cela, dans le Cookie Crumbler « login », renommez le fichier DTML « logged_out » en « logged_out_old ». Puis créez un script Python à cet endroit « logged_out ». Vous comprenez bien que celui-ci remplacera l'ancien généré par cookie crumbler.

Mettez-y le code suivant :

PYTHON

from Products.PythonScripts.standard import html_quote
request = container.REQUEST
response =  request.response
response.expireCookie('__ac')
context.login.logout()
response.redirect(context.monSite.absolute_url())

Explications :

Lorsque vous désirez vous déconnecter, il faut que ZOPE donne l'instruction que le cookie « __ac » qui regroupe les informations d'authentification soit détruit. Pour ce faire, la ligne « response.expireCookie('__ac') » donne l'instruction que le cookie a expiré.

La ligne suivante appelle la méthode logout de l'objet login. Cette action aura comme conséquence de détruire le User et donc vous repasserez comme utilisateur anonyme.

La dernière ligne est une simple redirection vers notre point de départ, c'est-à-dire http://localhost:8080/cookBook/TestCookieCrumbler/monSite. Mais puisque nous ne sommes plus authentifié, le mécanisme de sécurité de ZOPE déclenche la procédure d'authentification, et nous dirige alors vers la page login_form.

7 - Conclusion

Vous venez de voir comment vous pouvez mettre en place un formulaire d'authentification utilisant les mécanismes de sécurité de ZOPE.

Vous constatez que l'utilisation de Cookies Crumbler est très simple, et gère presque tout pour vous. Cependant, la critique que j'y ferais est que dans la plupart des cas vous devrez réécrire une partie du code des interfaces (login_form, logged_out...) pour les rendre plus pratiques à modifier. En effet le langage DTML étant considéré comme obsolète, il est plus sage de réécrire les fichiers automatiquement générés par Cookie Crumbler, en utilisant des ZOPE Page Template pour les interfaces Html et des scripts Python pour les traitements.

8 - Liens utiles

http://zope2.zope.org/

http://codemark.tuxfamily.org/totoriel-cookiecrumbler-sous-zope/

9 - Remerciements

Je remercie toutes les personnes qui m'ont apporté de près ou de loin leur aide sur le sujet, ainsi que Claude LELOUP pour ses relectures et corrections.