Spring Security Form Login

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

Read more

Zwei Login-Seiten mit Spring Security

Eine schnelle und praktische Anleitung zum Konfigurieren von Spring Security mit zwei separaten Anmeldeseiten.

Read more

Spring Sicherheitsformular Login

Ein Beispiel für die Anmeldung im Frühjahr - Einrichten eines einfachen Anmeldeformulars, einer grundlegenden XML-Sicherheitskonfiguration und weiterer erweiterter Konfigurationstechniken.

Read more

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

User:
Password:

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