[JAVA] Erstellen Sie eine API-Schlüsselauthentifizierung für die Web-API in Spring Security

Was du machen willst

Authentifizieren Sie sich für jede Anforderung mit dem API-Schlüssel im Header, z. B. beim Aufrufen einer Web-API mit Spring Security.

Ein Beispiel in Java finden Sie in einem persönlichen Blog-Beitrag [Spring] Verwenden von Spring Security zum Autorisieren von Web-APIs. Dieser Artikel enthält auch ein Beispiel für die Berechtigungsprüfung durch @PreAuthorize.

Realisierungsmethode

  1. Nehmen Sie Einstellungen vor, um die Authentifizierung für jede Anforderung ohne Verwendung einer Sitzung durchzuführen
  2. Erstellen Sie Filter und Dienste, um die Authentifizierungsverarbeitung mithilfe des API-Schlüssels im Anforderungsheader durchzuführen.
  3. Registrieren Sie den in 2 erstellten Filter und Service.

1. Einstellung für die Authentifizierung für jede Anforderung

Setzen Sie die Sitzungsrichtlinie mit der Konfigurationsmethode von WebSecurityConfigurerAdapter auf zustandslos. Stellen Sie SessionCreationPolicy.STATELESS wie folgt ein.

@Configuration
@EnableWebSecurity
class SecurityConfig: WebSecurityConfigurerAdapter() {

    override fun configure(http: HttpSecurity?) {
        http
                ?.authorizeRequests()
                ?.antMatchers("/hello/**")?.hasAnyRole("USER", "ADMIN")
                ?.antMatchers("/admin/**")?.hasRole("ADMIN")
                ?.anyRequest()
                ?.authenticated()
                ?.and()
                ?.addFilter(preAuthenticatedProcessingFilter())
                ?.exceptionHandling()
                ?.authenticationEntryPoint(http401UnauthorizedEntryPoint())

        //Authentifizieren Sie sich für jede Anfrage
        http?.sessionManagement()?.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
    }
    ....

2. Erstellen Sie einen Authentifizierungsprozess mit dem API-Schlüssel im Anforderungsheader

Verwenden Sie die Vorauthentifizierung von Spring Security (https://docs.spring.io/spring-security/site/docs/4.2.x-SNAPSHOT/reference/html/preauth.html). Erstellen Sie einen Filter, der AbstractPreAuthenticatedProcessingFilter und AuthenticationUserDetailsService verwendet, um den API-Schlüssel aus dem Anforderungsheader und einen Dienst abzurufen, der sich mit dem API-Schlüssel authentifiziert.

Filter erstellen

Erstellen Sie eine Klasse, die AbstractPreAuthenticatedProcessingFilter erbt, und erstellen Sie einen Prozess zum Extrahieren des API-Schlüssels im Anforderungsheader in der Methode getPreAuthenticatedCredentials.

 class MyPreAuthenticatedProcessingFilter: AbstractPreAuthenticatedProcessingFilter() {

    //API-Schlüssel abrufen
    override fun getPreAuthenticatedCredentials(request: HttpServletRequest?): Any {
        return request?.getHeader("X-Auth-Token") ?: ""
    }

    override fun getPreAuthenticatedPrincipal(request: HttpServletRequest?): Any {
        return ""
    }
}

Einen Service erstellen

Erstellen Sie eine Klasse, die AuthenticationUserDetailsService wie unten gezeigt erbt, und erstellen Sie einen Authentifizierungsprozess mit dem erfassten API-Schlüssel. Geben Sie PreAuthenticatedAuthenticationToken für den Typparameter an. Hier wird eine geeignete Verarbeitung zum Testen geschrieben, aber eine Verarbeitung zum Überprüfen des API-Schlüssels unter Verwendung einer externen API oder DB wird geschrieben.

class MyAuthenticationUserDetailService: AuthenticationUserDetailsService<PreAuthenticatedAuthenticationToken> {

    override fun loadUserDetails(token: PreAuthenticatedAuthenticationToken?): UserDetails {
    
        //API-Schlüssel von MyPreAuthenticatedProcessingFilter erhalten
        val credential = token?.credentials
        
        if (credential.toString() == "") {
            throw UsernameNotFoundException("User not found")
        }

        return when (credential) {
            "token1" -> User("user", "", AuthorityUtils.createAuthorityList("ROLE_USER"))
            "token2" -> User("admin", "", AuthorityUtils.createAuthorityList("ROLE_ADMIN"))
            else -> User("user", "", AuthorityUtils.createAuthorityList("ROLE_INVALID") )
        }
    }
}

3. Registrieren Sie Filter und Dienste

Fügen Sie die Bean-Definition wie folgt hinzu, damit der erstellte Filter und Service DI ist.

@Configuration
@EnableWebSecurity
class SecurityConfig: WebSecurityConfigurerAdapter() {

    override fun configure(http: HttpSecurity?) {
        http
                ?.authorizeRequests()
                ?.antMatchers("/hello/**")?.hasAnyRole("USER", "ADMIN")
                ?.antMatchers("/admin/**")?.hasRole("ADMIN")
                ?.anyRequest()
                ?.authenticated()
                ?.and()
                ?.addFilter(preAuthenticatedProcessingFilter())

        http?.sessionManagement()?.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
    }

    //Bedienung
    @Bean
    fun authenticationUserDetailsService(): AuthenticationUserDetailsService<PreAuthenticatedAuthenticationToken> {
        return MyAuthenticationUserDetailService()
    }

    //Filterregistrierung
    @Bean
    fun preAuthenticatedAuthenticationProvider(): PreAuthenticatedAuthenticationProvider {
        return PreAuthenticatedAuthenticationProvider().apply {
            setPreAuthenticatedUserDetailsService(authenticationUserDetailsService())
            setUserDetailsChecker(AccountStatusUserDetailsChecker())
        }
    }

    //Filter
    @Bean
    fun preAuthenticatedProcessingFilter(): AbstractPreAuthenticatedProcessingFilter {
        return MyPreAuthenticatedProcessingFilter().apply {
            setAuthenticationManager(authenticationManager())
        }
    }
}

Recommended Posts

Erstellen Sie eine API-Schlüsselauthentifizierung für die Web-API in Spring Security
Erstellen Sie einen Web-API-Server mit Spring Boot
Sicherheit in Webanwendungen
Java: Zeitgesteuerte Token-Verwaltungsklasse für die Web-API-Authentifizierung
Erstellen Sie eine API zum Senden und Empfangen von Json-Daten mit Spring
Spring Security-Nutzungsnotiz Authentifizierung / Autorisierung
Implementierte Authentifizierungsfunktion mit Spring Security ②
Spring Boot Tutorial Verwenden der Spring Security-Authentifizierung
Implementierte Authentifizierungsfunktion mit Spring Security ①
Erfahren Sie mehr über die Architektur der Spring Security-Authentifizierungsverarbeitung
Implementieren Sie die REST-API mit Spring Boot
Legen Sie HTTP-Header (X-Frame-Optionen) nur für bestimmte URLs in Spring Security fest
Einstellungen beim Aufrufen der API mithilfe von CSRF-Maßnahmen von Spring Security in JMeter
Erstellen Sie mit IntelliJ ein Java Spring Boot-Projekt
Erreichen Sie die BASIC-Authentifizierung mit Spring Boot + Spring Security
Erstellen Sie eine Bulletin Board-API mit Zertifizierung und Autorisierung in Rails 6 # 6. Zeigen Sie, erstellen Sie die Implementierung
Implementierungsbeispiel bei gemeinsamer Verwendung der Formularauthentifizierung und der Anforderungsheaderauthentifizierung in Spring Security
Erstellen Sie mit Spring Security eine Anmelde- / Abmeldefunktion gemäß dem offiziellen Spring-Leitfaden [für Anfänger].
Nuxt.js × Erstellen Sie eine Anwendung im Rails-API-Modus
SameSite-Cookie im Spring Boot (Spring Web MVC + Tomcat)
Erstellen Sie die Authentifizierungsfunktion in der Rails-Anwendung mit devise
Versuchen Sie die LDAP-Authentifizierung mit Spring Security (Spring Boot) + OpenLDAP
Erstellen Sie in Salesforce ein Tool zur Namensidentifizierung
Fügen Sie mit Spring Security Ihre eigenen Authentifizierungselemente hinzu
Spring - Fehler- / Fehlervermeidung beim Erstellen einer API für POST
[Einführung in Spring Boot] Authentifizierungsfunktion mit Spring Security
Erstellen Sie mit Spring Boot 2.0 einen Spring Cloud Config Server mit Sicherheit
Erstellen Sie eine Web-App, die genau zum Lernen geeignet ist [Spring Boot + Thymeleaf + PostgreSQL]