mercredi 13 mai 2009

Utiliser la sécurité de WebSphere pour un projet Web dans RAD

Ce petit tuto va vous expliquer rapidement comment mettre en place un système de login robuste et performant dans un projet Web sous Web Sphere (version 6.1 ici).

On va faire cela sous RAD (Rational Application Developper).

Dans 80% des applications (et dans 99% en entreprise), on a besoin d'authentifier un utilisateur. Par authentification, on entends un système qui permet d'identifier un utilisateur de l'application, en l'occurrence ici, par son login et son mot de passe.

Gérer l'authentification est très sensible car elle peut poser des problèmes de sécurité pourtant c'est un élément élémentaire pour toute application Web. Heureusement pour nous, avec trés peu d'effort, on peut mettre en place un système trés fiable et souple en utilisant l'authentification intégrée à Web Sphere. En 10 min on pourra mettre en place ce système ! alors qu'il faudrait plusieures heures de travail si on le développerai soit même (avec tous les risques que cela comporte).

Supposons que vous avez une projet Web déjà tout prêt (projet JSP, Struts 2 etc... peu importe) dans RAD et que vous voulez y rajouter l'authentification et un système de gestion de rôle. En effet, chaque utilisateur du système n'a pas forcément les mêmes droits. Par exemple, un utilisateur lambda pourra par exemple que consulter les données alors que peut être l'administrateur pourra lui créer, supprimer ou modifier. On dit qu'on attribut des rôles aux utilisateurs. Un utilisateur peut avoir plusieurs rôles en même temps. Avec une gestion assez fine des rôles, on peut arriver à permettre ou interdire certaines fonctionnalités de l'application selon l'utilisateur.

Avant de commencer, il faut activer, si ce n'est pas déjà fait, la sécurité dans WebSphere :
  1. Ouvrir la console administrative de WebSphere
  2. Dans Sécurité/Administration, applications et infrastructure sécurisée, il faut que 'Activer la sécurité applicative' soit cochée. Si ce n'est pas le cas, éxecuter l'assistant de configuration des paramètres de sécurité.
  3. Suivre les indications de l'assistant. Notamment, on vous demandera un login et mot de passe pour se connecter à WebSphere (bien retenir ces informations car elles vous seront demandées à la prochaine connexion à la console administrative !)
  4. Sauvegarder vos modifications et redémarrer le serveur WebSphere
  5. RAD ne risque de plus fonctionner avec votre serveur. Double cliquer sur le serveur dans RAD et dans la partie sécurité : cocher "la sécurité est active sur ce serveur" puis renseigner le login et mot de passe saisis au point 3
La sécurité est désormais active sur le serveur ! Vous verrez que maintenant, les adresses sont en https et non plus en http

On va voir maintenant comment créer notre page de login. Elle va être simple : elle contient seulement un formulaire qui va envoyer les informations de connexion à Web Sphere.
Voici son code HTML :

<html>
<body>

<form action="j_security_check" method="post" />

Login : <input type="text" name="j_username" /><br>
Password : <input type="password" name="j_password" /><br>
<input type="submit" value="Connect" />
</form>

<body>
</html>


Lorsque l'utilisateur clique sur 'Connect', le login et mot de passe sont envoyées dans une servlet de WebSphere : j_security_check. Cette servlet vérifie que l'utilisateur existe bien et vérifie son mot de passe. Si l'utilisateur est connu, l'utilisateur sera authentifié sur toutes les pages de l'application Web.
Les utilisateurs sont définis directement dans WebSphere (dans la partie Sécurité ou Utilisateur et Groupe sous la console administrative). C'est assez bien fait, car on peut très bien coupler WebSphere et Active Directory de Windows, ainsi, tous les utilisateurs de Windows seront directement utilisables par notre application !!!

Maintenant il gérer la sécurité dans notre projet avec RAD :
  1. Ouvrir le projet Web dans RAD
  2. Ouvrir Web.xml (descripteur de déploiement)
  3. Aller dans l'onglet "Pages"
  4. Dans la partie "Connexion", mettre "FORM" dans la méthode d'authentification et /login.jsp dans la page de connexion. Cela indique qu'on utilise la page de login créée plus haut comme page de connexion à notre application
Il faut désormais définir les rôles de sécurité. Identifiez les et les créer :
  1. Dans Web.xml, aller dans l'onglet "Sécurité"
  2. Ajouter un roles (en haut de l'écran), par exemple le rôle Admin qui sera destiné aux administrateurs de l'application
  3. Procéder de même pour tous les roles
Une fois les rôles définis, on doit spécifier à quoi ont accès les rôles. ça peut être n'importe qu'elle ressource du site (jsp, image, feuille de style, action struts etc...) :
  1. Toujours dans l'onglet "Sécurité" de Web.xml, créer une contrainte sécurité. Une contrainte spécifie un groupe de ressource que l'on autorise pour des rôles
  2. La contrainte doit avoir au moins un pattern de ressource. Le pattern définit l'ensemble des ressources concernées : par exemple *.jsp pour toutes les jsp du site, *.action pour toutes les actions struts 2, admin*.jsp pour toutes les pages jsp commençant par admin etc...
  3. Il faut ensuite associer les roles à ces ressources. Seuls les utilisateurs ayant les rôles choisis auront accés aux ressources
Pour finir, il reste plus qu'a associer les rôles aux utilisateurs (un utilisateur peut avoir plusieurs roles). Il y a deux méthodes : à partir de la console administrative de WebSphere ou directement à partir de RAD :
  1. Dans RAD, ouvrir l'éditeur de sécurité du projet (dans l'arborescence du prjet)
  2. Les rôles créés dans Web.xml devraient apparaitre.
  3. On peut mapper des utilisateurs ou des groupes à chaque role.
  4. Créer éventuellement les utilisateurs dans WebSphere (à partir de la console administrative)
Pour tester votre application, ouvrez une page concernée par une contrainte de sécurité. Tout d'abord, l'application va vous demander un login/mdp. Choisir un utilisateur ayant le bon rôle. Vous devez avoir accés à la page. Recommencer avec un utilisateur n'ayant pas le role, l'accés à la page doit être refusé.

Note : vous devez proposer, à tout moment, à l'utilisateur de se déconnecter de l'application. Pour cela, rajouter un lien cliquable sur chacune de vos pages pointant vers l'URL : ibm_security_logout?logoutExitPage=##URL##
Remplacer ##URL## par l'adresse de la page vers laquelle aller àpres la déconnexion (par exemple la page d'acceuil de votre site)

Voili, c'est tout !

6 commentaires:

  1. Bonsoir,
    Merci pour cet excellent article.
    J'aurais souhaité connaitre s'il existe quelque chose de similaire sur la version 5.1.2 (WSAD) ? En effet sur la console d'administration je ne dispose pour ma part pas de l'onglet "Sécurité/Administration, applications et infrastructure sécurisée"
    Merci d'avance pour votre réponse.

    RépondreSupprimer
  2. Bon, j'ai réussi à refaire toutes les étapes sur mon 5.1.2 mais... il ne se passe rien chez moi!
    Le serveur démarre bien sur le FORM mais après quelque soit ce que je rentre comme valeur il me renvoi instantanément à ce même FORM.
    J'ai l'impression que l'action "j_security_check" n'existe pas chez moi ??!?

    RépondreSupprimer
  3. Bon j'ai réussi tant bien que mal à trouver ce qui clochait puis à configurer correctement l'utilsation de SWAM.
    Pourrais-tu cependant détailer le volet relatif à Active Directory de Windows stp ?
    Je ne désépère pas d'avoir une réponse... un jour... :)

    RépondreSupprimer
  4. C'est génial, j'ai réussi à raccorder tout ça à l'active directory tout seul comme un grand. Remarque je n'ai pas beaucoup de mérite grâce à ton blog.
    Reste un gros problème pour les masques d'url qui se comportent un peu n'importe comment...

    RépondreSupprimer
  5. Mes problèmes sont résolus. Pour les personnes voulant plus de détails se référer au lien suivant:
    http://www.developpez.net/forums/d801869/java/developpement-web-java/problemes-j_security_check-retour/#post4609769

    RépondreSupprimer
  6. Bonjour,

    Merci beaucoup pour cet article très clair et synthétique!

    Il me semble que votre procédure décrit l'activation de la sécurité de type "basique"... auriez-vous la possibilité d'expliquer la même chose pour une sécurité de type authentification forte, en couplage avec une brique authentifiante tierce (par exemple, un reverse proxy aurthentifiant) couplée à WAS par LTPA?

    D'avance merci,
    Cdlt
    AP.

    RépondreSupprimer