dimanche 16 novembre 2008

GWT && ( ACEGI || Spring Security )

Il y a quelques temps, j'ai eu pour mission d'ACEGIfier une application Web en GWT.
Le but premier était de sécuriser l'accès aux ressources concernant l'affichage ! Alors pour ce qui est de sécuriser les services exposés etc. ce n'est pas l'objet de ce billet !

Etape 1/
Après quelques recherches sur mon ami google, j'ai pu rapidement me rendre compte qu'il était plutôt préconisé d'utiliser une page html/jsp autonome pour s'authentifier. Soit, n'étant pas un fervent défenseur du tuning applicatif, je n'ai pas perdu de temps avec ça, j'avais bien assez à faire avec ACEGI lui même.
cf:http://www.dotnetguru2.org/bmarchesson/index.php?c=1&more=1&pb=1&tb=1&title=technical_tip_using_acegi_with_gwt
Voici le résultat, pas folichon, n'est ce pas ?! Mais c'est rapide et fonctionnel !

Code:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html">
<title>My Login Page</title>
</head>
<body>
<h2>Please log in</h2><br>
<form method="POST" action="j_acegi_security_check">
Username: <input type="text" name="j_username"><br>
Password: <input type="password" name="j_password"><br>
<input type="submit" value="Log in >>">
</form>
</body>
</html>

Image:

Etape 2/
Après coup, je me suis aperçu que ma page HTML de login était quelque peu en décalage avec l'application, feuille de style, internationalisation des libellés... J'ai donc réalisé un écran GWT d'authentification d'après le HOWTO d'Instantiations.com ! J'ai ensuite affiché cet écran dans firefox et avec firebug j'ai pu récupérer le code HTML correspondant... Mais ce n'est pas terminé, après quoi, il a fallut ACEGIfier le code HTML.

Je vous passe le code... c'est du GWT et c'est plutôt verbeux !

Image (lors d'une authentification erronée) :





Etape 3/
L'application et l'écran de login étaient donc en phase ! Enfin, jusqu'à ce que je me rende compte que l'écran de login s'affichait différent en fonction des navigateurs... En effet, dans ie6, la fenêtre était déformée ! Normal, GWT ne sert donc pas a rien, il adapte le code HTML en fonction du navigateur... et ayant copier coller le code HTML depuis firefox... bref, il me fallait trouver une autre solution: un module GWT d'authentification !

En ajoutant un module d'authentification dans mon projet GWT, je suis certain de ne plus avoir de problèmes d'affichage ! Et je peux lui appliquer le même style que l'application principale ! Et je peux internationaliser l'authentification de la même façon ! Par contre, je dois modifier ma configuration ACEGI pour authoriser l'accès au fichiers GWT du module de login mais pas au reste de l'application !

J'utilise un FormPanel classique de GWT (pas GWT-EXT) et je le configure pour ACEGI (j_username, j_password, j_acegi_security_check, POST) rien de plus !

Voici le résultat, pas tellement différent qu'à l'étape 2 me direz vous, mais le gain se situe au niveau de la maintenabilité et l'homogénéitéde l'application !

Code :
A venir
Rapidement:
Il faut utiliser un FormPanel de GWT natif.

FormPanel form = new FormPanel();
form.setAction("j_acegi_security_check");

on le configure pour la méthode POST

on ajoute les 2 composants de saisi du login / pass en leur donnant des noms particuliers : j_username et j_password

un bouton de validation avec un listener qui submit : form.submit();

et voila...

Image :

Etape 4/
Il faut maintenant modifier le tout pour créer un module d'authentification autonome et non embarquer dans mon application... Histoire de le réutiliser de la même façon dans d'autres applications avec du SSO par exemple. La suite au prochain épisode !

4 commentaires:

  1. Bonjour, très bon article...

    Vous mentionnez qu'il est nécessaire d'utiliser un FormPanel GWT natif... Pour quelle raison est-ce obligatoire (j'envisage pour ma part l'utilisation de smartgwt) ?

    Je suis également fortement intéressé par l'étape 4 (module indépendant et SSO). Avez-vous réussi cette dernière ?

    RépondreSupprimer
  2. Merci,

    Avec le Formpanel de GWT-EXT, j'ai eu des problèmes de submit du formulaire (peut etre une erreur dans le code).

    Le Formpanel de smartGWT fonctionne surement très bien, il faut tenter sa chance.

    Le code devrait être très très similaire en plus.

    Le module d'authentification est dans un projet qui contient également le module de l'application. Le module d'authentification est dans un package à part. Mais il ne me semblait pas simple de l'externaliser dans un autre projet, j'ai donc laissé en l'état pour le moment.

    Pour ce qui est du SSO, il faudrait voir du coté d'utilisation de CAS dans Spring Security, je n'ai pas ce besoin actuellement mais ca va venir avec le temps...

    RépondreSupprimer
  3. Bonjour,

    Merci pour l'article.
    Je n'arrive pas a autoriser l'accès au module d'authent j'ai toujours une 404.
    J'ai tenter de faire
    mais sans succès
    Quelle conf faut-il utiliser pour authoriser l'accès au module d'authent.
    Merci

    RépondreSupprimer
  4. Bonjour,

    D'abord merci pour l'article.

    J'ai tenter de mettre en place la même conf. mais j'ai un souci.
    En effet, ma page d'authent n'est pas chargé (j'ai une erreur 404). J'ai tenter de mettre dans la conf
    intercept-url pattern="/com.test.Login/Login.html" filters="none"
    mais sans succès.
    Comment faire pour que le module d'authent soit accessible ?

    Merci

    RépondreSupprimer