Spring Security Form Login

1. Einleitung

Dieser Artikel konzentriert sich auf die Anmeldung mit Spring Security . Wir werden auf dem einfachen vorherigen Spring MVC-Beispiel aufbauen, da dies ein notwendiger Bestandteil der Einrichtung der Webanwendung zusammen mit dem Anmeldemechanismus ist.

2. Die Maven-Abhängigkeiten

Wenn mit Federverschluß arbeiten, die Feder-boot-Starter-Sicherheit wird Starter automatisch alle Abhängigkeiten enthalten wie federsicherheits Kern , Feder-security-Bahn und Feder-Sicherheits-config unter anderem:

 org.springframework.boot spring-boot-starter-security 2.3.3.RELEASE 

Falls wir Spring Boot nicht verwenden, lesen Sie bitte den Artikel Spring Security with Maven, in dem beschrieben wird, wie Sie alle erforderlichen Abhängigkeiten hinzufügen. Es werden sowohl die Standard- Spring-Security-Web- als auch die Spring-Security-Konfiguration benötigt.

3. Spring Security Java-Konfiguration

Beginnen wir mit der Erstellung einer Spring Security-Konfigurationsklasse, die WebSecurityConfigurerAdapter 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 { // authentication manager (see below) } @Override protected void configure(final HttpSecurity http) throws Exception { // http builder configurations for authorize requests and form login (see below) } }

In diesem Beispiel haben wir die In-Memory-Authentifizierung verwendet und 3 Benutzer definiert.

Als Nächstes gehen wir die Elemente durch, die wir zum Erstellen der Formularanmeldekonfiguration verwendet haben.

Lassen Sie uns zuerst unseren Authentifizierungsmanager erstellen.

3.1. Authentifizierungs-Manager

Der Authentifizierungsanbieter wird durch eine einfache speicherinterne Implementierung unterstützt - speziell InMemoryUserDetailsManager . Dies ist nützlich für das Rapid Prototyping, wenn ein vollständiger Persistenzmechanismus noch nicht erforderlich ist:

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"); }

Hier konfigurieren wir drei Benutzer mit fest codiertem Benutzernamen, Kennwort und Rolle.

Ab Spring 5 müssen wir auch einen Passwort-Encoder definieren . In unserem Beispiel haben wir den BCryptPasswordEncoder verwendet:

@Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }

Als nächstes konfigurieren wir die HttpSecurity.

3.2. Konfiguration zum Autorisieren von Anforderungen

Wir beginnen mit den erforderlichen Konfigurationen, um Anforderungen zu autorisieren.

Hier erlauben wir anonymen Zugriff auf / Login, damit sich Benutzer authentifizieren können. Beschränken / Verwalten auf ADMIN- Rollen und Sichern von allem anderen:

@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() // ... }

Beachten Sie, dass die Reihenfolge der antMatchers () -Elemente von Bedeutung ist - die spezifischeren Regeln müssen zuerst kommen, gefolgt von den allgemeineren .

3.3. Konfiguration für die Formularanmeldung

Als Nächstes erweitern wir die obige Konfiguration für das Anmelden und Abmelden von Formularen:

@Override protected void configure(final HttpSecurity http) throws Exception { http // ... .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()); }
  • loginPage () - die benutzerdefinierte Anmeldeseite
  • loginProcessingUrl () - Die URL, an die der Benutzername und das Kennwort gesendet werden sollen
  • defaultSuccessUrl () - Die Zielseite nach erfolgreicher Anmeldung
  • failUrl () - Die Zielseite nach einer erfolglosen Anmeldung
  • logoutUrl () - die benutzerdefinierte Abmeldung

4. Fügen Sie der Webanwendung Spring Security hinzu

Um die oben definierte Spring Security-Konfiguration zu verwenden, müssen Sie sie an die Webanwendung anhängen.

Wir werden den WebApplicationInitializer verwenden , daher müssen wir keine web.xml bereitstellen :

public class AppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext sc) { AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext(); root.register(SecSecurityConfig.class); sc.addListener(new ContextLoaderListener(root)); sc.addFilter("securityFilter", new DelegatingFilterProxy("springSecurityFilterChain")) .addMappingForUrlPatterns(null, false, "/*"); } }

Beachten Sie, dass dieser Initialisierer nicht erforderlich ist, wenn wir eine Spring Boot-Anwendung verwenden. Weitere Informationen zum Laden der Sicherheitskonfiguration in Spring Boot finden Sie in unserem Artikel zur automatischen Konfiguration der Spring Boot-Sicherheit.

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. Die web.xml

Vor der Einführung von Spring 4 haben wir die Spring Security-Konfiguration in der web.xml konfiguriert - nur ein zusätzlicher Filter, der der Standard-Spring MVC web.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 - die FilterChainProxy - 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 registriert, mit dem Namen von Ansichten URLs zugeordnet werden können, ohne dass dazwischen ein expliziter Controller erforderlich ist:

registry.addViewController("/login.html");

This, of course, corresponds to the login.jsp:


    
User:
Password:

The Spring Login form has the following relevant artifacts:

  • login – the URL where the form is POSTed to trigger the authentication process
  • username – the username
  • password – the password

8. Further Configuring Spring Login

We briefly discussed a few configurations of the login mechanism when we introduced the Spring Security Configuration above – let's go into some detail now.

One reason to override most of the defaults in Spring Security is to hide the fact that the application is secured with Spring Security and minimize the information a potential attacker knows about the application.

Fully configured, the login element looks like this:

@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") }

Or the corresponding XML configuration:

8.1. The Login Page

Next, let's see how we can configure a custom login page using the loginPage() method:

http.formLogin() .loginPage("/login.html")

Or, via XML configuration:

login-page='/login.html'

If we don't specify this, Spring Security will generate a very basic Login Form at the /login URL.

8.2. The POST URL for Login

The default URL where the Spring Login will POST to trigger the authentication process is /login which used to be /j_spring_security_check before Spring Security 4.

We can use the loginProcessingUrl method to override this URL:

http.formLogin() .loginProcessingUrl("/perform_login")

Or, via XML configuration:

login-processing-url="/perform_login"

A good reason to override this default URL is to hide the fact that the application is actually secured with Spring Security – that information should not be available externally.

8.3. The Landing Page on Success

After a successful login process, the user is redirected to a page – which by default is the root of the web application.

We can override this via the defaultSuccessUrl() method:

http.formLogin() .defaultSuccessUrl("/homepage.html")

Or with XML configuration:

default-target-url="/homepage.html"

In case the always-use-default-target is set to true, then the user is always redirected to this page. If that attribute is set to false, then the user will be redirected to the previous page they wanted to visit before being prompted to authenticate.

8.4. The Landing Page on Failure

Same as with the Login Page, the Login Failure Page is autogenerated by Spring Security at /login?error by default.

To override this, we can use the failureUrl() method:

http.formLogin() .failureUrl("/login.html?error=true")

Or with XML:

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

9. Conclusion

In diesem Spring-Anmeldebeispiel haben wir einen einfachen Authentifizierungsprozess konfiguriert. Wir haben das Spring-Sicherheitsanmeldeformular, die Sicherheitskonfiguration und einige der erweiterten erweiterten Anpassungen erläutert.

Die Implementierung dieses Spring Login-Tutorials finden Sie im GitHub-Projekt. 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:

//localhost:8080/spring-security-mvc-login/login.html