Accueil

Une introduction aux servlets et aux JSP

Troisième partie


Partie  1  2  3

Formulaire de connexion

La première ébauche de notre projet est maintenant terminée. Mais tout cela n'est pas vraiment sécurisé : nous sommes incapable de contrôler l'accès à notre application. Comment faire ? nous pouvons par exemple créer une page de connexion par laquelle devre passer toute personne qui souhaite accéder à l'application. Une telle page, que nous intitulerons login.jsp, peut se présenter de la façon suivante :

<title>Connexion</title>

<form action="checkLogin.jsp" method="POST">
  <table>
    <tr> <td>Nom</td>          <td><input type="text" name="name"></td>         </tr>
    <tr> <td>Mot de passe</td> <td><input type="password" name="password"></td> </tr>
    <tr> <td></td>             <td><input type="submit" value="Valider"></td>   </tr>
  </table>
</form>

Dans ce formulaire, nous avons introduit un nouveau type de zone de saisie — <input type="password">. Celui-ci est particulièrement adapté à la saisie des mots de passe puisque les caractères saisis n'apparaissent pas tels quels : ils sont remplacés par des étoiles. Ceci empêchera la personne passant dans le couloir de pouvoir lire votre mot de passe alors que vous le saisirez.

Lorsque ce formulaire est validé, le nom et le mot de passe sont transférés à la JSP checkLogin.jsp comme cela est indiqué dans le paramètre action de la balise form. Le contenu de cette JSP est le suivant :

<%
  String name = request.getParameter("name");
  String password = request.getParameter("password");
%>

<% if ("Olivier Mangez".equals(name) && "lz53a6?M".equals(password) { %>
Identification réussie
<% } else { %>
Echec de l'identification
<% } %>

En quoi consiste l'identification ? On considère qu'elle est réussie si l'utilisateur s'est identifié en utilisant "Olivier Mangez" comme nom et "lz53a6?M" comme mot de passe. Toute autre tentative de connexion est considérée comme un échec.

Il faut que je revienne sur la notation "Olivier Mangez".equals(name) : en Java, les chaînes de caractères sont des objets — plus précisément, ce sont des instances de la classe java.lang.String. D'une manière générale, les objets sont créés en utilisant l'opérateur new. Cependant, si on peut effectivement créer une chaîne de caractères ainsi new String("Olivier Mangez"), on peut toutefois utiliser une notation plus simple que propose Java pour des raisons de facilité : "Olivier Mangez". C'est pour cela que l'on est capable d'appeler des méthodes sur cet objet, notamment la méthode equals qui permet de tester l'égalité de deux chaînes de caractères.

Mais pourquoi ne pas avoir écrit plus simplement name.equals("Olivier Mangez") ? Parce que le retour de la fonction getParameter, et par conséquent la variable name, peut être nul et que l'on ne peut pas appeler une méthode sur un objet qui n'existe pas. Il faudrait donc d'écrire name != null && name.equals("Olivier Mangez") ce qui est, vous me l'accorderez, un peu laborieux. Au contraire "Olivier Mangez" n'est jamais nul et on peut donc toujours appeler sa méthode equals.

<% if ("Olivier Mangez".equals(name) && "lz53a6?M".equals(password) { %>
<jsp:forward page="editMessage.jsp" flush="true"/>
<% } else { %>
<jsp:forward page="login.jsp" flush="true"/>
<% } %>

Sécurisation des fichiers

Nous venons de créer une page de connexion et nous en sommes très fier ! Mais à quoi cela nous sert-il ? Les utilisateurs non autorisés peuvent toujours utiliser les pages viewMessage.jsp et editMessage.jsp ! Ce qu'il faudrait, c'est les empêcher de le faire s'ils ne se sont pas identifiés.

Jusqu'à présent nous ne nous sommes pas préoccupé de savoir qui appelait les pages que nous avons créées.

<% session.setAttribute("user", "Olivier Mangez") %>
<jsp:forward page="editMessage.jsp" flush="true"/>

 

<% if (session.getAttribute("user") == null) { %>
<jsp:forward page="login.jsp" flush="true"/>
<% } %>

Factorisons un peu

On pourrait nous reprocher d'avoir dupliqué le code de vérification de la connexion dans les différentes pages notamment parce que si l'on décide plus tard de modifier la façon dont on traite cette vérification, nous devrons modifier toutes les pages.

Il existe un mécanisme d'inclusion simple dans la syntaxe JSP. Nous allons le mettre en œuvre immédiatement.

L'idée consiste à placer le code redondant dans un fichier JSP et de faire appel à ce fichier dans toutes les pages. Pour cela, copiez la scriptlet que l'on a ajoutée précédemment dans un fichier que nous appélerons inc_login.jsp. Il est intéressant de préfixer un tel fichier par inc_ afin de se souvenir qu'il ne s'agit pas d'une page JSP classique — c'est à dire qu'on ne l'appelle pas à partir d'un navigateur. Au contraire, il s'agit d'une page qui est incluse dans d'autres pages — inc_ signifie inclus. Bien entendu ce préfixage n'est qu'une proposition ; vous pouvez choisir tout autre chose.

Une fois le fichier d'inclusion créé, il nous faut l'inclure dans les autres pages. Pour cela, la syntaxe JSP introduit les déclarations. Les déclarations sont encadrées par <%@ et %>. Remplacez, dans les JSP d'édition et de visualisation d'un message, la scriplet de vérification de la connexion par la déclaration suivante :

<%@ page include="inc_login.jsp" %>

Partie  1  2  3