Sichern von Java EE mit Spring Security

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

User:
Password:

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>:


    This text is only visible to an admin
    
">Admin Page

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.