Spring-Sicherheitsauthentifizierungsanbieter
1. Überblick
Dieses Tutorial zeigt, wie Sie einAuthentication Provider in Spring Security einrichten, um zusätzliche Flexibilität im Vergleich zum Standardszenario mit einem einfachenUserDetailsService zu ermöglichen.
2. Der Authentifizierungsanbieter
Spring Security bietet eine Vielzahl von Optionen für die Durchführung der Authentifizierung. Diese folgen einem einfachen Vertrag -an Authentication request is processed by an AuthenticationProvider und ein vollständig authentifiziertes Objekt mit vollständigen Anmeldeinformationen wird zurückgegeben.
Die Standard- und häufigste Implementierung istDaoAuthenticationProvider - das die Benutzerdetails von einem einfachen, schreibgeschützten Benutzer-DAO abruft -UserDetailsService. Dieser Benutzerdetailserviceonly has access to the username, um die vollständige Benutzerentität abzurufen. Dies ist für die meisten Szenarien ausreichend.
Weitere benutzerdefinierte Szenarien müssen weiterhin auf die vollständigeAuthentication-Anforderung zugreifen, um den Authentifizierungsprozess ausführen zu können. Zum Beispiel bei der Authentifizierung bei einem externen Dienst eines Drittanbieters (z. B.Crowd) -both the username and the password from the authentication request will be necessary.
Für diese fortgeschritteneren Szenarien benötigen wirdefine a custom Authentication Provider:
@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 erteilten Berechtigungen, die für das zurückgegebeneAuthentication-Objekt festgelegt wurden, leer sind. Dies liegt daran, dass 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("org.example.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 erfolgt grundsätzlich mit oder ohne diesen benutzerdefinierten Authentifizierungsanbieter im Back-End.
Verwenden Sie einen einfachen Befehlcurl, um eine authentifizierte Anforderung zu senden:
curl --header "Accept:application/json" -i --user user1:user1Pass
http://localhost:8080/spring-security-custom/api/foo/1
In diesem Beispiel haben wir die REST-API mit der Standardauthentifizierung 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 wurde ein Beispiel für einen benutzerdefinierten Authentifizierungsanbieter für Spring Security erläutert.
Die vollständige Implementierung dieses Tutorials finden Sie inthe GitHub project.