Développement de filtres de servlet pour le traitement de la connexion par formulaire

Vous pouvez contrôler l'aspect de l'écran de connexion à l'aide du mécanisme de connexion par formulaire. Dans la connexion par formulaire, vous indiquez une page de connexion utilisée pour extraire les informations de mot de passe et d'ID utilisateur. Vous pouvez également indiquer une page d'erreur qui s'affiche lorsque l'authentification n'aboutit pas.

Pourquoi et quand exécuter cette tâche

Si une authentification ou un traitement supplémentaire est requis avant ou après l'authentification, les filtres de servlet sont facultatifs. Les filtres de servlet peuvent dynamiquement intercepter des demandes et des réponses pour convertir ou utiliser les informations qu'elles contiennent. Un ou plusieurs filtres de servlet peuvent être associés à un servlet ou à un groupe de servlets. Les filtres de servlet peuvent également être associés à des fichiers JSP (JavaServer Pages) et des pages HTML. Tous les filtres de servlet associés son appelés avant le servlet.

Les connexions par formulaire et les filtres de servlet sont pris en charge par les conteneurs Web conformes à la spécification de servlet Version 2.3. Le servlet de connexion par formulaire effectue l'authentification et les filtres de servlet effectuent une authentification supplémentaire, un audit ou une consignation des informations.

Pour effectuer des actions de pré-connexion et de post-connexion à l'aide des filtres de servlet, configurez ces filtres pour la prise en charge de la page de connexion par formulaire ou pour l'URL /j_security_check. L'URL j_security_check est transmise par une page de connexion par formulaire avec le paramètre j_username contenant le nom d'utilisateur et le paramètre j_password contenant le mot de passe. Un filtre de servlet peut utiliser le paramètre de nom d'utilisateur et les informations de mot de passe pour une authentification avancée ou pour d'autres besoins spéciaux.

Procédure

  1. Un filtre de servlet implémente la classe javax.servlet.Filter. Implémentez trois méthodes dans la classe de filtre :
    • init(javax.servlet.FilterConfig cfg). Cette méthode n'est appelée par le conteneur qu'une seule fois ; lors de la mise en service du filtre de servlet. Le paramètre FilterConfig transmis à cette méthode contient les paramètres d'initialisation du filtre de servlet. Indiquez les paramètres d'initialisation pour un filtre de servlet lors de la configuration à l'aide de l'outil d'assemblage.
    • destroy. Cette méthode est appelée par le conteneur lorsque le filtre de servlet est retiré d'un service.
    • doFilter(ServletRequest req, ServletResponse res, FilterChain chain). Cette méthode est appelée par le conteneur pour chaque demande de servlet mappée vers ce filtre avant l'appel du servlet. La chaîne FilterChain transmise à cette méthode permet d'appeler le filtre suivant de la chaîne de filtres. Le servlet d'origine demandé est exécuté lorsque le dernier filtre de la chaîne appelle la méthode chain.doFilter. C'est pourquoi, tous les filtres appellent la méthode chain.doFilter pour que le servlet d'origine soit exécuté après le filtrage. Si une vérification d'authentification supplémentaire est implémentée dans le code du filtre et qu'elle se traduit par un échec, le servlet d'origine n'est pas exécuté. La méthode chain.doFilter n'est pas appelée et peut être redirigée vers une autre page d'erreur.
  2. Si un servlet est mappé à plusieurs filtres de servlet, ces filtres sont appelés dans l'ordre indiqué dans le descripteur de déploiement web.xml de l'application. Placez le fichier de classes du filtre dans le répertoire WEB-INF/classes de l'application.

Exemple

Exemple de filtre de servlet.

Ce filtre de connexion peut être mappé vers l'URL /j_security_check pour effectuer les actions de pré-connexion et de post-connexion.

import javax.servlet.*;
     public class LoginFilter implements Filter {
     protected FilterConfig filterConfig;
     // Appelé une fois, lorsque ce filtre est instancié. 
     // Si mappé vers j_security_check, appelé 
     // la première fois que j_security_check est appelé.
     public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
        }
     public void destroy() {
        this.filterConfig = null;
        }
      // Appelé pour chaque demande mappée à ce filtre. 
     // Si mappé vers j_security_check, 
     // appelé pour chaque action j_security_check
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
         throws java.io.IOException, ServletException   {
         // action de pré-connexion
         chain.doFilter(request, response);  
         // appelle le filtre suivant de la chaîne.  
         // j_security_check si ce filtre est 
         // mappé vers j_security_check.
        // action de post-connexion.
                 }
       }
Utilisation des filtres de servlet pour effectuer le traitement préconnexion et postconnexion lors d'une connexion par formulaire

Cet exemple explique comment des filtres de servlet peuvent effectuer le traitement préconnexion et postconnexion, lors d'une connexion par formulaire.

Code source du filtre de servlet : LoginFilter.java
/**
 * Exemple de filtre de servlet : Cet exemple filtre j_security_check et
 * effectue une action de préconnexion pour déterminer si l'utilisateur qui tente
 * de se connecter se trouve dans la liste des utilisateurs révoqués. Dans ce cas,
 * une erreur est renvoyée au navigateur.
 *
 * Ce filtre lit le nom de fichier de la liste des utilisateurs révoqué dans 
 * la configuration de filtre transmise dans la méthode init(). Il lit le fichier
 * de la liste des utilisateurs révoqués
 et crée une liste revokedUsers.
 * 
 * Lorsque la méthode doFilter method est appelée, la connexion de l'utilisateur
 * est contrôlée 
 pour s'assurer que l'utilisateur ne figure pas sur la
 *  liste des utilisateurs révoqués.
 *
 */

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class LoginFilter implements Filter {

   protected FilterConfig filterConfig;

   java.util.List revokeList; 
   

   /**
    * init() : méthode init() appelée lors de l'instanciation du filtre.
    * Ce filtre est instancié la première fois que j_security_check est 
    * appelé pour l'application (lors de l'accès à un servlet protégé 
    * de l'application).
    */
   public void init(FilterConfig filterConfig) throws ServletException {
      this.filterConfig = filterConfig;

      // lire la liste des utilisateurs révoqués
      revokeList = new java.util.ArrayList(); 
      readConfig();
   }


   /**
    * destroy() : méthode destroy() appelée lorsque le filtre est mis 
    * hors service.
    */
   public void destroy() {
      this.filterConfig = null;
      revokeList = null;
   }

   /**
    * doFilter() : Méthode doFilter() appelée avant l'appel du servlet 
    * auquel ce filtre est mappé. Ce filtre étant mappé à j_security_check,  
    * cette méthode est appelé avant l'affichage de l'action 
    * j_security_check action.
    */
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws java.io.IOException, ServletException {


      HttpServletRequest req = (HttpServletRequest)request;
      HttpServletResponse res = (HttpServletResponse)response;

      // action de pré-connexion
      
      // obtenir le nom d'utilisateur 
      String username = req.getParameter("j_username");

      // si l'utilisateur est dans liste des révoqués, envoyer une erreur
      if ( revokeList.contains(username) ) {
      res.sendError(javax.servlet.http.HttpServletResponse.SC_UNAUTHORIZED);
      return;
      }
      
      // appeler le prochain filtre de la chaîne : laisser j_security_check authentifier 
      // l'utilisateur
      chain.doFilter(request, response);

      // action post-connexion

   }

   /**
    * readConfig() : lit le fichier de la liste des utilisateurs révoqués et crée une 
    * liste d'utilisateurs révoqués.
    */
   private void readConfig() {
      if ( filterConfig != null ) {

         // obtenir le fichier de la liste des utilisateurs révoqués et l'ouvrir.
         BufferedReader in;
         try { 
               String filename = filterConfig.getInitParameter("RevokedUsers");
               in = new BufferedReader( new FileReader(filename));
         } catch ( FileNotFoundException fnfe) {
               return;
         }
	
         // lire tous les utilisateurs révoqués et les ajouter à la liste. 
         String userName;
         try {
               while ( (userName = in.readLine()) != null ) 
                   revokeList.add(userName);
         } catch (IOException ioe) {
         }

      }
  
   }

   
}
Important : Dans l'exemple de code précédent, la ligne commençant par public void doFilter(ServletRequest request est présentée sur deux lignes à des fins d'illustration. La ligne public void doFilter(ServletRequest request et la ligne suivante sont sur deux lignes.
Exemple de fichier web.xml illustrant le filtre LoginFilter configuré et mappé à l'URL j_security_check :
<filter id="Filter_1">
    <filter-name>LoginFilter</filter-name>
	   <filter-class>LoginFilter</filter-class>
	        <description>Effectue une opération préconnexion et postconnexion</description>
			 <init-param>
			 <param-name>RevokedUsers</param-name>
			 <param-value>c:\WebSphere\AppServer\installedApps\
                            <app-name>\revokedUsers.lst</param-value>
				</init-param>
</filter-id>

<filter-mapping>
	<filter-name>LoginFilter</filter-name>
	    <url-pattern>/j_security_check</url-pattern>
</filter-mapping>
Exemple de fichier de liste d'utilisateurs révoqués :
user1
cn=user1,o=ibm,c=us
user99
cn=user99,o=ibm,c=us

Icône indiquant le type de rubrique Rubrique de tâche



Icône d'horodatage Dernière mise à jour: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tsec_servlet
Nom du fichier : tsec_servlet.html