Anmeldung für eine Spring Web App - Fehlerbehandlung und -lokalisierung

Anmeldung für eine Spring Web App - Fehlerbehandlung und -lokalisierung

1. Überblick

In diesem Artikel wird veranschaulicht, wiea simple Login Page mit Spring MVC für eine Anwendung implementiert werden, die die Authentifizierung mit Spring Security im Backend verwaltet.

Um alle Details zum Umgang mit der Anmeldung mit Spring Security zu erfahren, gehenhere’s the articleausführlich auf die Konfiguration und Implementierung ein.

2. Die Anmeldeseite

Beginnen wir mit der Definition vona very simple login page:




   

Login

User:
Password:

Fügen wir nun eine clientseitige Überprüfung hinzu, um sicherzustellen, dassusername undpassword eingegeben wurden, bevor wir das Formular überhaupt senden. In diesem Beispiel verwenden wir einfaches Javascript, aber JQuery ist auch eine hervorragende Option:

Wie Sie sehen können, prüfen wir einfach, ob die Felderusername oderpassword leer sind. Wenn dies der Fall ist, wird ein Javascript-Meldungsfeld mit der entsprechenden Meldung angezeigt.

3. Nachrichtenlokalisierung

Weiter - Lokalisieren wir die Nachrichten, die wir im Frontend verwenden. Es gibt Arten solcher Nachrichten, und jede wird auf unterschiedliche Weise lokalisiert:

  1. Nachrichten generiertbefore Das Formular wird von den Controllern oder Handlern von Spring verarbeitet. Diese Nachrichten können auf den JSP-Seiten referenziert werden und sind mitJsp/Jslt localization lokalisiert (siehe Abschnitt 4.3.)

  2. Nachrichten, die lokalisiert werden, sobald eine Seite zur Verarbeitung durch Spring gesendet wurde (nach dem Senden deslogin-Formulars); Diese Nachrichten werden mitSpring MVC localization lokalisiert (siehe Abschnitt 4.2.)

3.1. Diemessage.properties-Dateien

In beiden Fällen müssen wir für jede Sprache, die wir unterstützen möchten, einemessage.properties-Datei erstellen. Die Namen der Dateien sollten dieser Konvention entsprechen:messages [localeCode] .properties_.

Wenn wir beispielsweise englische und spanische Fehlermeldungen unterstützen möchten, haben wir die Datei:messages_en.properties undmessages_es_ES.properties. Beachten Sie, dass für Englisch -messages.properties auch gültig ist.

Wir werden diese beiden Dateien im Klassenpfad des Projekts ablegen (src/main/resources). Die Dateien enthalten einfach die Fehlercodes und Meldungen, die wir in verschiedenen Sprachen anzeigen müssen - zum Beispiel:

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. Konfigurieren der Spring MVC-Lokalisierung

Spring MVC bietet einLocaleResolver, das in Verbindung mit seinerLocaleChangeInterceptor-API die Anzeige von Nachrichten in verschiedenen Sprachen ermöglicht, abhängig von der Ländereinstellung. Um die Lokalisierung zu konfigurieren, müssen wir die folgenden Beans in unserer MVC-Konfiguration: definieren

@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;
}

Ein wichtiger und weiter fortgeschrittener Hinweis ist, dass wir sicherstellen müssen, dassthe messageSource bean is defined in the right Spring context - der Kontext, in dem es verwendet wird. Beachten Sie, dass die Webanwendung den Stammkontext und dann einen (oder mehrere) Servletkontexte hat.

Standardmäßig bezieht der Gebietsschema-Resolver den Gebietsschema-Code aus dem HTTP-Header. Um ein Standardgebietsschema zu erzwingen, müssen Sie es auflocaleResolver() setzen:

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

Dieser Gebietsschema-Resolver ist einCookieLocaleResolver, was bedeutet, dass er die Gebietsschemainformationen in einem clientseitigen Cookie speichert. Als solches wird das Gebietsschema des Benutzers bei jeder Anmeldung und während des gesamten Besuchs gespeichert.

Alternativ gibt es einSessionLocaleResolver, das sich während der gesamten Sitzung an das Gebietsschema erinnert. Um stattdessen diesesLocaleResolver zu verwenden, müssen wir die obige Methode durch die folgende ersetzen:

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

Beachten Sie zum Schluss, dassLocaleChangeInterceptor das Gebietsschema basierend auf dem Wert eineslang-Parameters ändert, der mit der Anmeldeseite über einfache Links gesendet wird:

3.3. JSP/JSLT Localization

JSP/JSLT API will be used to display localized messages that are caught in the jsp page itself. Um die JSP-Lokalisierungsbibliotheken zu verwenden, sollten wir denpom.xml die folgenden Abhängigkeiten hinzufügen:


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


    javax.servlet
    jstl
    1.2

4. Anzeigen von Fehlermeldungen

4.1. Anmeldeüberprüfungsfehler

Um die JSP / JSTL-Unterstützung zu verwenden und lokalisierte Nachrichten inlogin.jspanzuzeigen, können Sie die folgenden Änderungen auf der Seite implementieren:

1. Fügen Sie denlogin.jsp das folgende Tag-lib-Element hinzu:

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

2. Fügen Sie das Element jsp / jslt hinzu, das auf die Dateien vonmessages.propertiesverweist:

3. Fügen Sie die folgenden<fmt:…>-Elemente hinzu, um die Nachrichten in JSP-Variablen zu speichern:


4. Ändern Sie das in Abschnitt 3 gezeigte Anmeldevalidierungsskript, um die Fehlermeldungen zu lokalisieren:

4.2. Fehler vor der Anmeldung

Manchmal wird der Anmeldeseite ein Fehlerparameter übergeben, wenn der vorherige Vorgang fehlgeschlagen ist. Über die Schaltfläche zum Senden eines Registrierungsformulars wird beispielsweise die Anmeldeseite geladen. Wenn die Registrierung erfolgreich war, ist es eine gute Idee, eine Erfolgsmeldung im Anmeldeformular und eine Fehlermeldung anzuzeigen, wenn das Gegenteil zutrifft.

In der folgenden Beispielformlogin implementieren wir dies, indem wir die ParameterregSucc undregErrorabfangen und eine lokalisierte Nachricht basierend auf ihren Werten anzeigen.


    

4.3. Anmeldesicherheitsfehler

Falls der Anmeldevorgang aus irgendeinem Grund fehlschlägt, leitet Spring Security eine Anmeldefehler-URL um, die wir als/login.html?error=true definiert haben.

Ähnlich wie wir den Status der Registrierung auf der Seite angezeigt haben, müssen wir dies im Falle eines Anmeldeproblems auch tun:


    

Beachten Sie, dass wir ein<spring:message …>-Element verwenden. Dies bedeutet, dass die Fehlermeldungen während der Spring MVC-Verarbeitung generiert werden.

Die vollständige Anmeldeseite - einschließlich der js-Validierung und dieser zusätzlichen Statusmeldungen - finden Sie ingithub project.

4.4. Abmeldefehler

Im folgenden Beispiel prüft der JSP-Code<c:if test=”$\{not empty SPRING_SECURITY_LAST_EXCEPTION}”> auf der Seitelogout.html, ob beim Abmeldevorgang ein Fehler aufgetreten ist.

Beispiel: Wenn eine Persistenzausnahme auftritt, wenn ein benutzerdefinierter Abmeldehandler versucht, Benutzerdaten zu speichern, bevor er zur Abmeldeseite umleitet. Obwohl diese Fehler selten sind, sollten wir sie so gut wie möglich behandeln.

Schauen wir uns die vollständigenlogout.jsp an:

<%@ 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

Beachten Sie, dass auf der Abmeldeseite auch die Abfragezeichenfolge paramlogSucc gelesen wird. Wenn der Werttrue entspricht, wird eine lokalisierte Erfolgsmeldung angezeigt.

5. Die Spring-Sicherheitskonfiguration

Der Schwerpunkt dieses Artikels liegt auf dem Frontend des Anmeldevorgangs und nicht auf dem Backend. Daher werden wir uns nur kurz mit den Hauptpunkten der Sicherheitskonfiguration befassen. Für die vollständige Konfiguration sollten Sieprevious article lesen.

5.1. Umleitung zur Anmeldefehler-URL

Die folgende Anweisung im Element<form-login…/>leitet den Fluss der Anwendung an die URL, unter der der Anmeldefehler behandelt wird:

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

5.2. Die Umleitung zum Abmelden erfolgreich

Das Attributlogout-success-url leitet einfach mit einem Parameter zur Abmeldeseite um, der bestätigt, dass die Abmeldung erfolgreich war.

6. Fazit

In diesem Artikel wurde veranschaulicht, wie eine Anmeldeseite für eine von Spring Security unterstützte Anwendung implementiert wird. Dabei werden die Anmeldevalidierung, die Anzeige von Authentifizierungsfehlern und die Lokalisierung von Nachrichten behandelt.

Wir werden uns im nächsten Artikel mit einer vollständigen Implementierung der Registrierung befassen - mit dem Ziel, eine vollständige Implementierung des Anmelde- und Registrierungsprozesses für die Produktion vorzubereiten.