Basisauthentifizierung von Spring Security
1. Überblick
Dieses Tutorial zeigt, wie SieBasic Authentication with Spring einrichten, konfigurieren und anpassen. Wir werden auf den einfachenSpring MVC example aufbauen und die Benutzeroberfläche der MVC-Anwendung mit dem von Spring Security bereitgestellten Basic Auth-Mechanismus sichern.
2. Die Spring-Sicherheitskonfiguration
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 ElementhttpBasic(), um die Basisauthentifizierung innerhalb derconfigure()-Methode einer Klasse zu definieren, dieWebSecurityConfigurerAdapter. erweitert
Dasselbe könnte auch mit XML erreicht werden:
Was hier relevant ist, ist das<http-basic>-Element innerhalb des Haupt<http>-Elements 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, bei dem Benutzer und Kennwort im Klartext definiert sind.
Dieweb.xml der Webanwendung, die Spring Security aktiviert, wurden bereits inSpring Logout tutorial erläutert.
3. Konsumieren der gesicherten Anwendung
Der Befehlcurl ist unser Werkzeug zum Konsumieren der gesicherten Anwendung.
Versuchen wir zunächst,/homepage.htmlanzufordern, ohne Sicherheitsanmeldeinformationen anzugeben:
curl -i http://localhost:8080/spring-security-rest-basic-auth/api/foos/1
Wir erhalten die erwarteten401 Unauthorized undthe 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 jedochcurlverwenden, ist dies nicht der Fall.
Fordern wir jetzt dieselbe Ressource an - die Homepage - aberprovide the credentials, um ebenfalls darauf zuzugreifen:
curl -i --user user1:user1Pass
http://localhost:8080/spring-security-rest-basic-auth/api/foos/1
Jetzt lautet die Antwort vom Server200 OK zusammen mitCookie:
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 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 bereitgestellteBasicAuthenticationEntryPointeine vollständige Seite für die Antwort von401 Unauthorizedan 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 realm="" + getRealmName() + """);
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
PrintWriter writer = response.getWriter();
writer.println("HTTP Status 401 - " + authEx.getMessage());
}
@Override
public void afterPropertiesSet() throws Exception {
setRealmName("example");
super.afterPropertiesSet();
}
}
Indem wir direkt in die HTTP-Antwort schreiben, 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 inSpring Security with Maven article erläutert. Zur Laufzeit sind sowohlspring-security-web als auchspring-security-config verfügbar.
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 belegt. Schließlich übernahm er die Kontrolle über das genaue Fehlermeldungsformat - von der Standard-HTML-Fehlerseite zu einem benutzerdefinierten Text- oder JSON-Format.
Die vollständige Implementierung dieses Tutorials finden Sie inthe GitHub project - 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: