Spring Security Authentication Provider

1. Übersicht

In diesem Lernprogramm wird gezeigt, wie Sie einen Authentifizierungsanbieter in Spring Security einrichten , um im Vergleich zum Standardszenario mit einem einfachen UserDetailsService zusätzliche Flexibilität zu ermöglichen .

2. Der Authentifizierungsanbieter

Spring Security bietet eine Vielzahl von Optionen für die Authentifizierung. Diese folgen einem einfachen Vertrag - eine Authentifizierungsanforderung wird von einem AuthenticationProvider verarbeitet und ein vollständig authentifiziertes Objekt mit vollständigen Anmeldeinformationen wird zurückgegeben.

Die Standard- und häufigste Implementierung ist der DaoAuthenticationProvider, der die Benutzerdetails von einem einfachen, schreibgeschützten Benutzer-DAO abruft - dem UserDetailsService . Dieser Benutzerdetailservice hat nur Zugriff auf den Benutzernamen, um die vollständige Benutzerentität abzurufen. Dies reicht für die meisten Szenarien aus.

Weitere benutzerdefinierte Szenarien müssen weiterhin auf die vollständige Authentifizierungsanforderung zugreifen , um den Authentifizierungsprozess ausführen zu können. Wenn Sie sich beispielsweise bei einem externen Dienst eines Drittanbieters (z. B. Crowd) authentifizieren, sind sowohl der Benutzername als auch das Kennwort aus der Authentifizierungsanforderung erforderlich .

Für diese fortgeschritteneren Szenarien müssen wir einen benutzerdefinierten Authentifizierungsanbieter definieren :

@Component public class CustomAuthenticationProvider implements AuthenticationProvider { @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { String name = authentication.getName(); String password = authentication.getCredentials().toString(); if (shouldAuthenticateAgainstThirdPartySystem()) { // use the credentials // and authenticate against the third-party system return new UsernamePasswordAuthenticationToken( name, password, new ArrayList()); } else { return null; } } @Override public boolean supports(Class authentication) { return authentication.equals(UsernamePasswordAuthenticationToken.class); } }

Beachten Sie, dass die für das zurückgegebene Authentifizierungsobjekt festgelegten Berechtigungen leer sind. Dies liegt daran, dass die Behörden natürlich anwendungsspezifisch sind.

3. Registrieren Sie den Auth Provider

Nachdem wir den Authentifizierungsanbieter definiert haben, müssen wir ihn in der XML-Sicherheitskonfiguration unter Verwendung der verfügbaren Namespace-Unterstützung angeben:

4. Java-Konfiguration

Schauen wir uns als nächstes die entsprechende Java-Konfiguration an:

@Configuration @EnableWebSecurity @ComponentScan("com.baeldung.security") public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private CustomAuthenticationProvider authProvider; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.authenticationProvider(authProvider); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests().anyRequest().authenticated() .and().httpBasic(); } }

5. Authentifizierung durchführen

Das Anfordern der Authentifizierung vom Client ist mit oder ohne diesen benutzerdefinierten Authentifizierungsanbieter im Back-End grundsätzlich identisch.

Verwenden wir einen einfachen Curl- Befehl, um eine authentifizierte Anfrage zu senden:

curl --header "Accept:application/json" -i --user user1:user1Pass //localhost:8080/spring-security-custom/api/foo/1

Für die Zwecke dieses Beispiels haben wir die REST-API mit der Basisauthentifizierung gesichert.

Und wir bekommen die erwarteten 200 OK vom Server zurück:

HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=B8F0EFA81B78DE968088EBB9AFD85A60; Path=/spring-security-custom/; HttpOnly Content-Type: application/json;charset=UTF-8 Transfer-Encoding: chunked Date: Sun, 02 Jun 2013 17:50:40 GMT

6. Fazit

In diesem Artikel haben wir ein Beispiel für einen benutzerdefinierten Authentifizierungsanbieter für Spring Security erläutert.

Die vollständige Implementierung dieses Tutorials finden Sie im GitHub-Projekt.