Frage Sicherung der Spring Boot API mit API Schlüssel und Secret


Ich möchte die Spring-Boot-API sichern, sodass sie nur für die Clients zugänglich ist, die über einen gültigen API-Schlüssel und einen gültigen Schlüssel verfügen. Es gibt jedoch keine Authentifizierung (Standardanmeldung mit Benutzername und Passwort) innerhalb des Programms, da alle Daten anonym sind. Alles, was ich erreichen möchte, ist, dass alle API-Anfragen nur für bestimmte Drittanbieter-Front-End verwendet werden können.

Ich habe eine Menge Artikel darüber gefunden, wie man die Spring Boot API mit Benutzerauthentifizierung sichern kann. Aber ich brauche keine Benutzerauthentifizierung. Woran ich denke ist, dass ich meinem Kunden einen API-Schlüssel und ein Geheimnis zur Verfügung stelle, damit er Zugang zu den Endpunkten hat.

Können Sie mir bitte vorschlagen, wie ich das erreichen kann? Vielen Dank!


9
2018-01-25 15:42


Ursprung


Antworten:


Erstellen Sie einen Filter, der die Header, die Sie für die Authentifizierung verwenden, erfasst.

    import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter;

public class APIKeyAuthFilter extends AbstractPreAuthenticatedProcessingFilter {

    private String principalRequestHeader;

    public APIKeyAuthFilter(String principalRequestHeader) {
        this.principalRequestHeader = principalRequestHeader;
    }

    @Override
    protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) {
        return request.getHeader(principalRequestHeader);
    }

    @Override
    protected Object getPreAuthenticatedCredentials(HttpServletRequest request) {
        return "N/A";
    }

}

Konfigurieren Sie den Filter in Ihrer Web Security-Konfiguration.

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;

@Configuration
@EnableWebSecurity
@Order(1)
public class APISecurityConfig extends WebSecurityConfigurerAdapter {

    @Value("${yourapp.http.auth-token-header-name}")
    private String principalRequestHeader;

    @Value("${yourapp.http.auth-token}")
    private String principalRequestValue;

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        APIKeyAuthFilter filter = new APIKeyAuthFilter(principalRequestHeader);
        filter.setAuthenticationManager(new AuthenticationManager() {

            @Override
            public Authentication authenticate(Authentication authentication) throws AuthenticationException {
                String principal = (String) authentication.getPrincipal();
                if (!principalRequestValue.equals(principal))
                {
                    throw new BadCredentialsException("The API key was not found or not the expected value.");
                }
                authentication.setAuthenticated(true);
                return authentication;
            }
        });
        httpSecurity.
            antMatcher("/api/**").
            csrf().disable().
            sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).
            and().addFilter(filter).authorizeRequests().anyRequest().authenticated();
    }

}

11
2018-01-25 17:39