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
Exemple
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 formulaireCet 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) {
}
}
}
}
<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>
user1
cn=user1,o=ibm,c=us
user99
cn=user99,o=ibm,c=us