Spring Security Authentication Provider

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.