Spring Sicherheitsformular Login
1. Einführung
Dieser Artikel konzentriert sich aufLogin with Spring Security. Wir werden auf den einfachenprevious Spring MVC exampleaufbauen, da dies ein notwendiger Bestandteil der Einrichtung der Webanwendung zusammen mit dem Anmeldemechanismus ist.
Weitere Lektüre:
Spring Security - Nach der Anmeldung zur vorherigen URL umleiten
Ein kurzes Beispiel für die Umleitung nach der Anmeldung in Spring Security
Zwei Login-Seiten mit Spring Security
Eine schnelle und praktische Anleitung zum Konfigurieren von Spring Security mit zwei separaten Anmeldeseiten.
Spring Sicherheitsformular Login
Ein Beispiel für die Anmeldung im Frühjahr - Einrichten eines einfachen Anmeldeformulars, einer grundlegenden XML-Sicherheitskonfiguration und weiterer erweiterter Konfigurationstechniken.
2. Die Maven-Abhängigkeiten
Informationen zum Hinzufügen von Maven-Abhängigkeiten zum Projekt finden Sie unterSpring Security with Maven article. Es werden sowohl Standardspring-security-web als auchspring-security-config benötigt.
3. Spring Security Java-Konfiguration
Beginnen wir mit der Erstellung einer Spring Security-Konfigurationsklasse, dieWebSecurityConfigurerAdapter. erweitert. Durch Hinzufügen von@EnableWebSecurity erhalten wir Unterstützung für Spring Security und MVC-Integration:
@Configuration
@EnableWebSecurity
public class SecSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(final AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user1").password(passwordEncoder().encode("user1Pass")).roles("USER")
.and()
.withUser("user2").password(passwordEncoder().encode("user2Pass")).roles("USER")
.and()
.withUser("admin").password(passwordEncoder().encode("adminPass")).roles("ADMIN");
}
@Override
protected void configure(final HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/anonymous*").anonymous()
.antMatchers("/login*").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login.html")
.loginProcessingUrl("/perform_login")
.defaultSuccessUrl("/homepage.html", true)
//.failureUrl("/login.html?error=true")
.failureHandler(authenticationFailureHandler())
.and()
.logout()
.logoutUrl("/perform_logout")
.deleteCookies("JSESSIONID")
.logoutSuccessHandler(logoutSuccessHandler());
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
In diesem Beispiel haben wir die In-Memory-Authentifizierung verwendet und 3 Benutzer definiert.
Lassen Sie uns nun die Elemente durchgehen, die wir zum Erstellen der Formularanmeldekonfiguration verwendet haben.
3.1. authorizeRequests()
Wir erlauben anonymen Zugriff auf/login, damit sich Benutzer authentifizieren können. Wir sichern auch alles andere.
Beachten Sie, dass die Reihenfolge derantMatchers()-Elemente signifikant ist -the more specific rules need to come first, followed by the more general ones.
3.2. formLogin()
Dies hat mehrere Methoden, mit denen wir das Verhalten der Formularanmeldung konfigurieren können:
-
loginPage() - diecustom login page
-
loginProcessingUrl() - Die URL, an die der Benutzername und das Passwort gesendet werden sollen
-
defaultSuccessUrl() - die Zielseite nach erfolgreicher Anmeldung
-
failureUrl() - die Zielseite nach einer erfolglosen Anmeldung
3.3. Authentifizierungs-Manager
Der Authentifizierungsanbieter wird durch eine einfache In-Memory-Implementierung unterstützt -InMemoryUserDetailsManager speziell. Dies ist nützlich für Rapid Prototyping, wenn noch kein vollständiger Persistenzmechanismus erforderlich ist.
Starting with Spring 5, we also have to define a password encoder. In unserem Beispiel haben wirBCryptPasswordEncoder. verwendet
4. Fügen Sie der Webanwendung Spring Security hinzu
Um die oben definierte Spring Security-Konfiguration verwenden zu können, müssen Sie sie an die Webanwendung anhängen. In diesem Fall benötigen wir keineweb.xml:
public class AppInitializer
extends AbstractAnnotationConfigDispatcherServletInitializer {
protected Class[] getRootConfigClasses() {
return new Class[] {SecSecurityConfig.class};
}
}
Beachten Sie, dass dieser Initialisierer nicht erforderlich ist, wenn wir eine Spring Boot-Anwendung verwenden. In unserem Artikel zuSpring Boot security auto-configuration finden Sie weitere Informationen zum Laden der Sicherheitskonfiguration in Spring Boot.
5. Die Spring Security XML-Konfiguration
Schauen wir uns auch die entsprechende XML-Konfiguration an.
Das Gesamtprojekt verwendet die Java-Konfiguration, daher müssen wir die XML-Konfigurationsdatei über eine Java@Configuration-Klasse importieren:
@Configuration
@ImportResource({ "classpath:webSecurityConfig.xml" })
public class SecSecurityConfig {
public SecSecurityConfig() {
super();
}
}
Und die Spring Security XML-Konfiguration -webSecurityConfig.xml:
6. Dieweb.xml
Vor der Einführung von Spring 4 haben wir die Spring Security-Konfiguration inweb.xml konfiguriert - nur ein zusätzlicher Filter, der zu den Standard-Spring MVCweb.xml hinzugefügt wurde:
Spring Secured Application
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
Der Filter -DelegatingFilterProxy - delegiert einfach an eine von Spring verwaltete Bean - dieFilterChainProxy -, die selbst von der vollständigen Verwaltung des Spring Bean-Lebenszyklus und dergleichen profitieren kann.
7. Das Anmeldeformular
Die Anmeldeformularseite wird bei Spring MVC mithilfe des einfachen Mechanismus fürmap views names to URLs registriert, ohne dass dazwischen ein expliziter Controller erforderlich ist:
registry.addViewController("/login.html");
Dies entspricht natürlich denlogin.jsp:
Login
DasSpring Login form hat die folgenden relevanten Artefakte:
-
login - Die URL, unter der das Formular veröffentlicht wird, um den Authentifizierungsprozess auszulösen
-
username - der Benutzername
-
password - das Passwort
8. Weitere Konfiguration von Spring Login
Wir haben einige Konfigurationen des Anmeldemechanismus kurz besprochen, als wir oben die Spring Security-Konfiguration eingeführt haben. Lassen Sie uns nun auf einige Details eingehen.
Ein Grund, die meisten Standardeinstellungen in Spring Security zu überschreiben, isthide the fact that the application is secured with Spring Security und die Minimierung der Informationen, die ein potenzieller Angreifer über die Anwendung kennt.
Vollständig konfiguriert sieht das Login-Element folgendermaßen aus:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin()
.loginPage("/login.html")
.loginProcessingUrl("/perform_login")
.defaultSuccessUrl("/homepage.html",true)
.failureUrl("/login.html?error=true")
}
Oder die entsprechende XML-Konfiguration:
8.1. Die Anmeldeseite
Als nächstes wollen wir sehen, wie wir eine benutzerdefinierte Anmeldeseite mitloginPage() method:konfigurieren können
http.formLogin()
.loginPage("/login.html")
Oder über die XML-Konfiguration:
login-page='/login.html'
Wenn wir dies nicht angeben, generiert Spring Security ein sehr einfaches Anmeldeformular unter der URL von/login.
8.2. Die POST-URL für die Anmeldung
Die Standard-URL, unter der die Spring-Anmeldung POST sendet, um den Authentifizierungsprozess auszulösen, ist/login, früher/j_spring_security_check vorSpring Security 4.
Wir können dieloginProcessingUrl-Methode verwenden, um diese URL zu überschreiben:
http.formLogin()
.loginProcessingUrl("/perform_login")
Oder über die XML-Konfiguration:
login-processing-url="/perform_login"
Ein guter Grund, diese Standard-URL zu überschreiben, besteht darin, die Tatsache zu verbergen, dass die Anwendung tatsächlich mit Spring Security gesichert ist - diese Informationen sollten nicht extern verfügbar sein.
8.3. Die Landing Page zum Erfolg
Nach einem erfolgreichen Anmeldevorgang wird der Benutzer auf eine Seite umgeleitet, bei der es sich standardmäßig um das Stammverzeichnis der Webanwendung handelt.
Wir können dies über diedefaultSuccessUrl()-Methode überschreiben:
http.formLogin()
.defaultSuccessUrl("/homepage.html")
Oder mit XML-Konfiguration:
default-target-url="/homepage.html"
Wennalways-use-default-target auf true gesetzt ist, wird der Benutzer immer auf diese Seite umgeleitet. Wenn dieses Attribut auf false gesetzt ist, wird der Benutzer zur vorherigen Seite umgeleitet, die er besuchen möchte, bevor er zur Authentifizierung aufgefordert wird.
8.4. Die Landing Page on Failure
Wie bei der Anmeldeseite wird die Anmeldefehlerseite standardmäßig von Spring Security bei/login?error automatisch generiert.
Um dies zu überschreiben, können wir diefailureUrl()-Methode verwenden:
http.formLogin()
.failureUrl("/login.html?error=true")
Oder mit XML:
authentication-failure-url="/login.html?error=true"
9. Fazit
In diesemSpring Login Example haben wir einen einfachen Authentifizierungsprozess konfiguriert. Wir haben das Spring Security-Anmeldeformular, die Sicherheitskonfiguration und einige der erweiterten verfügbaren Anpassungen besprochen.
Die Implementierung dieses Spring Login-Tutorials finden Sie inthe GitHub project - dies ist ein Eclipse-basiertes Projekt, daher sollte es einfach zu importieren und auszuführen sein.
Wenn das Projekt lokal ausgeführt wird, kann auf das Beispiel-HTML zugegriffen werden unter:
http://localhost:8080/spring-security-mvc-login/login.html