Java EE mit Spring Security sichern
1. Überblick
In diesem kurzen Tutorial sehen wir uns an, wie mansecure a Java EE web application with Spring Security macht.
2. Maven-Abhängigkeiten
Beginnen wir mit den erforderlichenSpring Security dependencies für dieses Tutorial:
org.springframework.security
spring-security-web
4.2.3.RELEASE
org.springframework.security
spring-security-config
4.2.3.RELEASE
org.springframework.security
spring-security-taglibs
4.2.3.RELEASE
Die neueste Spring Security-Version (zum Zeitpunkt des Schreibens dieses Tutorials) ist 4.2.3.RELEASE; Wie immer können wirMaven Central auf die neuesten Versionen überprüfen.
3. Sicherheitskonfiguration
Als Nächstes müssen wir die Sicherheitskonfiguration für die vorhandene Java EE-Anwendung einrichten:
@Configuration
@EnableWebSecurity
public class SpringSecurityConfig
extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth)
throws Exception {
auth.inMemoryAuthentication()
.withUser("user1").password("user1Pass").roles("USER")
.and()
.withUser("admin").password("adminPass").roles("ADMIN");
}
}
In derconfigure()-Methode richten wir dieAuthenticationManager ein. Der Einfachheit halber implementieren wir eine einfache In-Memory-Authentifizierung. Benutzerdetails sind fest codiert.
Dies ist für das Rapid Prototyping gedacht, wenn kein vollständiger Persistenzmechanismus erforderlich ist.
Als nächstes integrieren wir die Sicherheit in das vorhandene System, indem wir die KlasseSecurityWebApplicationInitializerhinzufügen:
public class SecurityWebApplicationInitializer
extends AbstractSecurityWebApplicationInitializer {
public SecurityWebApplicationInitializer() {
super(SpringSecurityConfig.class);
}
}
Diese Klasse stellt sicher, dassSpringSecurityConfig beim Start der Anwendung geladen wird. Zu diesem Zeitpunkt sindwe’ve achieved a basic implementation of Spring Security. Bei dieser Implementierung erfordert Spring Security standardmäßig eine Authentifizierung für alle Anforderungen und Routen.
4. Sicherheitsregeln konfigurieren
Wir können Spring Security weiter anpassen, indem wir dieconfigure(HttpSecurity http)-Methode vonWebSecurityConfigurerAdapterüberschreiben:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/auth/login*").anonymous()
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/auth/login")
.defaultSuccessUrl("/home", true)
.failureUrl("/auth/login?error=true")
.and()
.logout().logoutSuccessUrl("/auth/login");
}
Mit derantMatchers()-Methode konfigurieren wir Spring Security so, dass anonymer Zugriff auf/auth/login möglich ist und __ jede andere Anforderung authentifiziert.
4.1. Benutzerdefinierte Anmeldeseite
Eine benutzerdefinierte Anmeldeseite wird mit der MethodeformLogin()konfiguriert:
http.formLogin()
.loginPage("/auth/login")
Wenn dies nicht angegeben ist, generiert Spring Security eine Standardanmeldeseite mit/login:
Login
4.2. Benutzerdefinierte Landing Page
Nach erfolgreicher Anmeldung leitet Spring Security den Benutzer zum Stammverzeichnis der Anwendung weiter. Wir können dies überschreiben, indem wir eine Standard-Erfolgs-URL angeben:
http.formLogin()
.defaultSuccessUrl("/home", true)
Wenn Sie denalwaysUse-Parameter derdefaultSuccessUrl()-Methode auf true setzen, wird ein Benutzer immer auf die angegebene Seite umgeleitet.
Wenn der ParameteralwaysUse nicht oder auf false gesetzt ist, wird ein Benutzer zur vorherigen Seite weitergeleitet, auf die er zugreifen wollte, bevor er zur Authentifizierung aufgefordert wird.
In ähnlicher Weise können wir auch eine benutzerdefinierte Zielseite für Fehler angeben:
http.formLogin()
.failureUrl("/auth/login?error=true")
4.3. Genehmigung
Wir können den Zugriff auf eine Ressource nach Rolle einschränken:
http.formLogin()
.antMatchers("/home/admin*").hasRole("ADMIN")
Ein Benutzer ohne Administratorrechte erhält den Fehler Zugriff verweigert, wenn er versucht, auf den Endpunkt von/home/adminzuzugreifen.
Wir können Daten auf einer JSP-Seite auch basierend auf der Rolle eines Benutzers einschränken. Dies erfolgt mit dem Tag<security:authorize>:
Um dieses Tag verwenden zu können, müssen wir die Taglib von Spring Security oben auf der Seite einfügen:
<%@ taglib prefix="security"
uri="http://www.springframework.org/security/tags" %>
5. Spring Security XML-Konfiguration
Bisher haben wir uns mit der Konfiguration von Spring Security in Java befasst. Schauen wir uns eine äquivalente XML-Konfiguration an.
Zuerst müssen wir einesecurity.xml-Datei imweb/WEB-INF/spring-Ordner erstellen, die unsere XML-Konfigurationen enthält. Ein Beispiel für eine solchesecurity.xml-Konfigurationsdatei finden Sie am Ende des Artikels.
Beginnen wir mit der Konfiguration des Authentifizierungsmanagers und des Authentifizierungsanbieters. Der Einfachheit halber verwenden wir einfache, fest codierte Benutzeranmeldeinformationen:
Wir haben gerade einen Benutzer mit einem Benutzernamen, einem Kennwort und einer Rolle erstellt.
Alternativ können wir unseren Authentifizierungsanbieter mit einem Passwort-Encoder konfigurieren:
Wir können auch eine benutzerdefinierte Implementierung vonUserDetailsServiceoderDatasourcevon Spring als Authentifizierungsanbieter angeben. Weitere Details finden Sie unterhere.
Nachdem wir den Authentifizierungsmanager konfiguriert haben, richten wir die Sicherheitsregeln ein und wenden die Zugriffssteuerung an:
Im obigen Snippet haben wirHttpSecurity für die Verwendung der Formularanmeldung konfiguriert und/secure.jsp als URL für den Anmeldeerfolg festgelegt. Wir haben anonymen Zugriff auf/index.jsp und den Pfad von“/”gewährt. Außerdem haben wir festgelegt, dass für den Zugriff auf/secure.jsp eine Authentifizierung erforderlich sein sollte und ein authentifizierter Benutzer mindestens die BerechtigungsstufeROLE_USERhaben sollte.
Wenn Sie das Attributauto-config des Tagshttp auftrue setzen, wird Spring Security angewiesen, Standardverhalten zu implementieren, die in der Konfiguration nicht überschrieben werden müssen. Daher werden/login und/logout für die Benutzeranmeldung bzw. -abmeldung verwendet. Eine Standard-Anmeldeseite wird ebenfalls bereitgestellt.
Wir können dasform-login-Tag mit benutzerdefinierten Anmelde- und Abmeldeseiten und URLs weiter anpassen, um sowohl Authentifizierungsfehler als auch Erfolg zu behandeln. DasSecurity Namespace appendix listet alle möglichen Attribute für dieform-login (und andere) Tags auf. Einige IDEs ermöglichen auch die Überprüfung, indem Sie auf ein Tag klicken und dabei die Tastectrldrücken.
Damit die Konfiguration vonsecurity.xml beim Start der Anwendung geladen werden kann, müssen wir unserenweb.xml die folgenden Definitionen hinzufügen:
contextConfigLocation
/WEB-INF/spring/*.xml
springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy
springSecurityFilterChain
/*
org.springframework.web.context.ContextLoaderListener
Beachten Sie, dass der Versuch, XML- und Java-basierte Konfigurationen in derselben JEE-Anwendung zu verwenden, zu Fehlern führen kann.
6. Fazit
In diesem Artikel wurde gezeigt, wie eine Java EE-Anwendung mit Spring Security gesichert wird, und es wurden sowohl Java-basierte als auch XML-basierte Konfigurationen demonstriert.
Wir haben auch Möglichkeiten besprochen, den Zugriff auf bestimmte Ressourcen basierend auf der Rolle eines Benutzers zu gewähren oder zu widerrufen.
Der vollständige Quellcode und die XML-Definitionen sind inover on GitHub verfügbar.