Grundlegende Authentifizierung für Spring Security

1. Übersicht

Dieses Tutorial zeigt, wie Sie die Standardauthentifizierung mit Spring einrichten, konfigurieren und anpassen . Wir werden auf dem einfachen Spring MVC-Beispiel aufbauen und die Benutzeroberfläche der MVC-Anwendung mit dem von Spring Security bereitgestellten Basic Auth-Mechanismus sichern.

2. Die Spring Security-Konfiguration

Wir können Spring Security mit Java config konfigurieren:

@Configuration @EnableWebSecurity public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { @Autowired private MyBasicAuthenticationEntryPoint authenticationEntryPoint; @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user1").password(passwordEncoder().encode("user1Pass")) .authorities("ROLE_USER"); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/securityNone").permitAll() .anyRequest().authenticated() .and() .httpBasic() .authenticationEntryPoint(authenticationEntryPoint); http.addFilterAfter(new CustomFilter(), BasicAuthenticationFilter.class); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }

Hier verwenden wir das httpBasic () -Element, um die Standardauthentifizierung innerhalb der configure () -Methode einer Klasse zu definieren, die WebSecurityConfigurerAdapter erweitert.

Dasselbe könnte auch mit XML erreicht werden:

Was hier relevant ist, ist die Element innerhalb der Hauptleitung Element der Konfiguration - Dies reicht aus, um die Standardauthentifizierung für die gesamte Anwendung zu aktivieren. Der Authentifizierungsmanager steht nicht im Mittelpunkt dieses Lernprogramms. Daher verwenden wir einen In-Memory-Manager, dessen Benutzer und Kennwort im Klartext definiert sind.

Die web.xml der Webanwendung, die Spring Security aktiviert, wurde bereits im Spring Logout-Lernprogramm erläutert.

3. Konsumieren der gesicherten Anwendung

Der Befehl curl ist unser Werkzeug zum Konsumieren der gesicherten Anwendung.

Versuchen wir zunächst, die Datei /homepage.html anzufordern, ohne Sicherheitsanmeldeinformationen anzugeben :

curl -i //localhost:8080/spring-security-rest-basic-auth/api/foos/1

Wir erhalten die erwartete 401 Unauthorized und die Authentication Challenge zurück:

HTTP/1.1 401 Unauthorized Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=E5A8D3C16B65A0A007CFAACAEEE6916B; Path=/spring-security-mvc-basic-auth/; HttpOnly WWW-Authenticate: Basic realm="Spring Security Application" Content-Type: text/html;charset=utf-8 Content-Length: 1061 Date: Wed, 29 May 2013 15:14:08 GMT

Der Browser würde diese Herausforderung interpretieren und uns in einem einfachen Dialogfeld zur Eingabe von Anmeldeinformationen auffordern. Da wir jedoch Curl verwenden , ist dies nicht der Fall.

Fordern wir jetzt dieselbe Ressource an - die Homepage -, geben Sie jedoch auch die Anmeldeinformationen für den Zugriff an:

curl -i --user user1:user1Pass //localhost:8080/spring-security-rest-basic-auth/api/foos/1

Jetzt ist die Antwort vom Server zusammen mit einem Cookie 200 OK :

HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=301225C7AE7C74B0892887389996785D; Path=/spring-security-mvc-basic-auth/; HttpOnly Content-Type: text/html;charset=ISO-8859-1 Content-Language: en-US Content-Length: 90 Date: Wed, 29 May 2013 15:19:38 GMT

Über den Browser kann die Anwendung normal verwendet werden. Der einzige Unterschied besteht darin, dass eine Anmeldeseite nicht mehr unbedingt erforderlich ist, da alle Browser die Standardauthentifizierung unterstützen und den Benutzer in einem Dialogfeld zur Eingabe von Anmeldeinformationen auffordern.

4. Weitere Konfiguration - Der Einstiegspunkt

Standardmäßig gibt der von Spring Security bereitgestellte BasicAuthenticationEntryPoint eine vollständige Seite für eine nicht autorisierte 401- Antwort an den Client zurück. Diese HTML-Darstellung des Fehlers wird in einem Browser gut wiedergegeben, eignet sich jedoch nicht für andere Szenarien, z. B. eine REST-API, bei der eine JSON-Darstellung bevorzugt werden kann.

Der Namespace ist auch für diese neue Anforderung flexibel genug - um dies zu beheben - kann der Einstiegspunkt überschrieben werden:

Der neue Einstiegspunkt ist als Standard-Bean definiert:

@Component public class MyBasicAuthenticationEntryPoint extends BasicAuthenticationEntryPoint { @Override public void commence( HttpServletRequest request, HttpServletResponse response, AuthenticationException authEx) throws IOException, ServletException { response.addHeader("WWW-Authenticate", "Basic + getRealmName() + """); response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); PrintWriter writer = response.getWriter(); writer.println("HTTP Status 401 - " + authEx.getMessage()); } @Override public void afterPropertiesSet() throws Exception { setRealmName("Baeldung"); super.afterPropertiesSet(); } }

Durch das direkte Schreiben in die HTTP-Antwort haben wir jetzt die volle Kontrolle über das Format des Antwortkörpers.

5. Die Maven-Abhängigkeiten

Die Maven-Abhängigkeiten für Spring Security wurden bereits im Artikel Spring Security with Maven erläutert. Zur Laufzeit benötigen wir sowohl das Spring-Security-Web als auch die Spring-Security-Konfiguration .

6. Fazit

In diesem Beispiel haben wir eine MVC-Anwendung mit Spring Security und Basic Authentication gesichert. Wir haben die XML-Konfiguration besprochen und die Anwendung mit einfachen Curl-Befehlen konsumiert. Übernahm schließlich die Kontrolle über das genaue Format der Fehlermeldung - von der Standard-HTML-Fehlerseite zu einem benutzerdefinierten Text- oder JSON-Format.

Die vollständige Implementierung dieses Tutorials finden Sie im GitHub-Projekt - dies ist ein Maven-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-rest-basic-auth / api / foos / 1.