Connexion pour une application Web Spring - Traitement des erreurs et localisation

Connexion pour une application Web Spring - Gestion des erreurs et localisation

1. Vue d'ensemble

Dans cet article, nous allons illustrer comment implémentera simple Login Page avec Spring MVC pour une application qui gère l'authentification avec Spring Security dans le backend.

Pour plus de détails sur la façon de gérer la connexion avec Spring Security,here’s the article approfondit la configuration et la mise en œuvre de cela.

2. La page de connexion

Commençons par définira very simple login page:




   

Login

User:
Password:

Maintenant, incluons une vérification côté client pour nous assurer que lesusername etpassword ont été saisis avant même d'envoyer le formulaire. Pour cet exemple, nous utiliserons du Javascript brut, mais JQuery est également une excellente option:

Comme vous pouvez le voir, nous vérifions simplement si les champsusername oupassword sont vides; s'ils le sont - une boîte de message javascript apparaîtra avec le message correspondant.

3. Localisation de message

Ensuite, localisons les messages que nous utilisons sur le front-end. Il existe plusieurs types de messages de ce type, chacun étant localisé de manière différente:

  1. Messages générésbefore le formulaire est traité par les contrôleurs ou gestionnaires de Spring. Ces messages peuvent être référencés dans les pages JSP et sont localisés avecJsp/Jslt localization (voir Section 4.3.)

  2. Messages qui sont localisés une fois qu'une page a été soumise pour traitement par Spring (après avoir soumis le formulairelogin); ces messages sont localisés à l'aide deSpring MVC localization (voir section 4.2.)

3.1. Les fichiersmessage.properties

Dans les deux cas, nous devons créer un fichiermessage.properties pour chaque langue que nous voulons prendre en charge; les noms des fichiers doivent suivre cette convention:messages [localeCode] .properties_.

Par exemple, si nous voulons prendre en charge les messages d'erreur en anglais et en espagnol, nous aurons le fichier:messages_en.properties etmessages_es_ES.properties. Notez que, pour l'anglais -messages.properties est également valide.

Nous allons placer ces deux fichiers dans le chemin de classe du projet (src/main/resources). Les fichiers contiennent simplement les codes d'erreur et les messages que nous devons afficher dans différentes langues - par exemple:

message.username=Username required
message.password=Password required
message.unauth=Unauthorized access!!
message.badCredentials=Invalid username or password
message.sessionExpired=Session timed out
message.logoutError=Sorry, error login out
message.logoutSucc=You logged out successfully

3.2. Configuration de la localisation Spring MVC

Spring MVC fournit unLocaleResolver qui fonctionne en conjonction avec son APILocaleChangeInterceptor pour rendre possible l'affichage des messages dans différentes langues, en fonction des paramètres régionaux. Pour configurer la localisation - nous devons définir les beans suivants dans notre configuration MVC:

@Override
public void addInterceptors(InterceptorRegistry registry) {
    LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
    localeChangeInterceptor.setParamName("lang");
    registry.addInterceptor(localeChangeInterceptor);
}
@Bean
public LocaleResolver localeResolver() {
    CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
    return cookieLocaleResolver;
}
@Bean
public MessageSource messageSource() {
    ReloadableResourceBundleMessageSource messageSource =
      new ReloadableResourceBundleMessageSource();
    messageSource.setBasename("classpath:messages");
    messageSource.setUseCodeAsDefaultMessage(true);
    messageSource.setDefaultEncoding("UTF-8");
    messageSource.setCacheSeconds(0);
    return messageSource;
}

Une remarque importante et plus avancée ici est que nous devons nous assurer quethe messageSource bean is defined in the right Spring context - le contexte dans lequel il va être utilisé. N'oubliez pas que l'application Web contient le contexte racine, puis un ou plusieurs contextes de servlet.

Par défaut, le résolveur de paramètres régionaux obtiendra le code de paramètres régionaux à partir de l'en-tête HTTP. Pour forcer une locale par défaut, nous devons la définir sur leslocaleResolver():

@Bean
public LocaleResolver localeResolver() {
    CookieLocaleResolver cookieLocaleResolver = new CookieLocaleResolver();
    cookieLocaleResolver.setDefaultLocale(Locale.ENGLISH);
    return cookieLocaleResolver;
}

Ce résolveur de paramètres régionaux est unCookieLocaleResolver, ce qui signifie qu'il stocke les informations de paramètres régionaux dans un cookie côté client; en tant que tel - il se souviendra des paramètres régionaux de l'utilisateur à chaque fois qu'il se connectera et pendant toute la visite.

Il existe également unSessionLocaleResolver, qui se souvient des paramètres régionaux tout au long de la session. Pour utiliser ceLocaleResolver à la place, nous devons remplacer la méthode ci-dessus par la suivante:

@Bean
public LocaleResolver localeResolver() {
    SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
    return sessionLocaleResolver;
}

Enfin, notez que leLocaleChangeInterceptor changera la locale en fonction de la valeur d'un paramètrelang envoyé avec la page de connexion par de simples liens:

3.3. JSP/JSLT Localization

JSP/JSLT API will be used to display localized messages that are caught in the jsp page itself. Pour utiliser les bibliothèques de localisation jsp, nous devons ajouter les dépendances suivantes auxpom.xml:


    javax.servlet.jsp
    javax.servlet.jsp-api
    2.3.2-b01


    javax.servlet
    jstl
    1.2

4. Affichage des messages d'erreur

4.1. Erreurs de validation de connexion

Afin d'utiliser le support JSP / JSTL et d'afficher les messages localisés dans leslogin.jsp, implémentons les changements suivants dans la page:

1. Ajoutez l'élément lib tag suivant auxlogin.jsp:

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

2. Ajoutez l'élément jsp / jslt qui pointera vers les fichiersmessages.properties:

3. Ajoutez les éléments<fmt:…> suivants pour stocker les messages sur les variables jsp:


4. Modifiez le script de validation de connexion présenté à la section 3 afin de localiser les messages d'erreur:

4.2. Erreurs de pré-connexion

Parfois, la page de connexion recevra un paramètre d'erreur si l'opération précédente a échoué. Par exemple, un bouton d'envoi du formulaire d'inscription chargera la page de connexion. Si l'enregistrement a réussi, il serait alors judicieux d'afficher un message de réussite dans le formulaire de connexion et un message d'erreur si l'inverse était vrai.

Dans l'exemple de formulairelogin ci-dessous, nous l'implémentons en interceptant les paramètres etregSucc etregError, et en affichant un message localisé basé sur leurs valeurs.


    

4.3. Erreurs de sécurité de connexion

Au cas où le processus de connexion échoue pour une raison quelconque, Spring Security effectuera une redirection vers une URL d'erreur de connexion, que nous avons définie comme étant/login.html?error=true.

Donc, de la même manière que nous avons montré l'état de l'enregistrement dans la page, nous devons faire de même en cas de problème de connexion:


    

Notez que nous utilisons un élément<spring:message …>. Cela signifie que les messages d'erreur sont générés lors du traitement de Spring MVC.

La page de connexion complète - y compris la validation js et ces messages d'état supplémentaires peuvent être trouvés dans legithub project.

4.4. Erreurs de déconnexion

Dans l'exemple qui suit, le code jsp<c:if test=”$\{not empty SPRING_SECURITY_LAST_EXCEPTION}”> de la pagelogout.html vérifiera s'il y a eu une erreur dans le processus de déconnexion.

Par exemple, s'il existe une exception de persistance lorsqu'un gestionnaire de déconnexion personnalisé tente de stocker les données utilisateur avant de les rediriger vers la page de déconnexion. Bien que ces erreurs soient rares, nous devrions également les traiter le plus précisément possible.

Jetons un œil auxlogout.jsp complets:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="sec"
    uri="http://www.springframework.org/security/tags"%>
<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>

    
Logged Out Login

Notez que la page de déconnexion lit également la chaîne de requête paramlogSucc, et si sa valeur est égale àtrue, un message de réussite localisé sera affiché.

5. La configuration de sécurité Spring

L’objectif de cet article est le frontend du processus de connexion, pas le backend - nous n’examinerons donc que brièvement les principaux points de la configuration de la sécurité; pour la configuration complète, vous devriez lire lesprevious article.

5.1. Redirection vers l'URL d'erreur de connexion

La directive suivante dans l'élément<form-login…/> dirige le flux de l'application vers l'url où l'erreur de connexion sera gérée:

authentication-failure-url="/login.html?error=true"

5.2. Redirection du succès de déconnexion

L'attributlogout-success-url redirige simplement vers la page de déconnexion avec un paramètre qui confirme que la déconnexion a réussi.

6. Conclusion

Dans cet article, nous avons illustré comment implémenter une page de connexion pour une application sauvegardée dans Spring Security - gérer la validation de la connexion, afficher les erreurs d'authentification et la localisation des messages.

Nous allons examiner une mise en œuvre complète de l'enregistrement dans le prochain article - dans le but d'avoir une mise en œuvre complète du processus de connexion et d'enregistrement prêt pour la production.