[JAVA] Oauth2-Authentifizierung mit Spring Cloud Gateway

Die Quelle ist wie folgt.

https://github.com/ko-aoki/spring-cloud-sample

Spring Cloud Gateway Ich denke, es wird als Mikrodienst verwendet Ich fragte mich, ob es nur wie eine Firewall verwendet werden könnte.

Verfassung

Die folgenden zwei Dienste werden verwendet. [cloud-gateway] [api]

Über [Cloud-Gateway] Greifen Sie auf den REST-Server [API] zu. [Cloud-Gateway] erfordert eine oauth2-Authentifizierung.

OAuth2-Autorisierungsserver

Starten Sie Keycloak mit Docker

Starten Sie den Keycloak-Server mit Docker. Unten wird postgresql aus Docker Compose ausgewählt.

https://github.com/keycloak/keycloak-containers/tree/master/docker-compose-examples

Die Grundbedienung der Keycloak-Konsole ist wie folgt. https://www.keycloak.org/getting-started/getting-started-docker

So behalten Sie die Keycloak-Einstellungen bei, z. B. Benutzer Stellen Sie eine Verbindung zu Ihrem lokalen Postgresql (auch Docker) her. Ich bezog mich auf Folgendes.

https://crudzoo.com/blog/docker-postgres

docker-compose.yml ist wie folgt, einschließlich des obigen Inhalts.


version: '3'

volumes:
  postgres_data:
      driver: local

services:
  postgres:
      image: postgres
      volumes:
        - postgres_data:/var/lib/postgresql/data
        - ./docker-entrypoint-initdb.d:/docker-entrypoint-initdb.d
      environment:
        POSTGRES_DB: keycloak
        POSTGRES_USER: keycloak
        POSTGRES_PASSWORD: password
  keycloak:
      image: quay.io/keycloak/keycloak:latest
      environment:
        DB_VENDOR: POSTGRES
        DB_ADDR: postgres
        DB_DATABASE: keycloak
        DB_USER: keycloak
        DB_SCHEMA: public
        DB_PASSWORD: password
        KEYCLOAK_USER: admin
        KEYCLOAK_PASSWORD: Pa55w0rd
        # Uncomment the line below if you want to specify JDBC parameters. The parameter below is just an example, and it shouldn't be used in production without knowledge. It is highly recommended that you read the PostgreSQL JDBC driver documentation in order to use it.
        #JDBC_PARAMS: "ssl=true"
      ports:
        - 8080:8080
      depends_on:
        - postgres

Realm, Client, User erstellen

Öffnen Sie die Keycloak-Verwaltungskonsole unten. Akapas ist in docker-compose.yml.

http://localhost:8080/auth/admin

Wenn Sie sich anmelden, wird dieser Bildschirm angezeigt.

スクリーンショット 2020-11-05 21.54.37.png

Stellen Sie wie folgt ein.

Realm:myrealm

Client ID:spring-client

Access type:confidential

Valid Redirect URIs: http://localhost:8082/*

username:myuser

Credentials

myuser/mypwd

Spring Cloud Gateway

Referenz

Ich setze pom.xml und config unter Bezugnahme auf die folgende Site.

https://piotrminkowski.com/2020/10/09/spring-cloud-gateway-oauth2-with-keycloak/

Da Spring-Cloud-Gateway Webflux ist, gilt Folgendes.

https://spring.pleiades.io/spring-security/site/docs/5.2.6.RELEASE/reference/html/webflux-oauth2.html

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>cloud-gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>cloud-gateway</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>11</java.version>
        <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-security</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

Mit WebFlux Spring Security Benötigt @EnableWebFluxSecurity.

SecurityConfig.java

package com.example.cloudgateway.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity;
import org.springframework.security.config.web.server.ServerHttpSecurity;
import org.springframework.security.oauth2.client.registration.ReactiveClientRegistrationRepository;
import org.springframework.security.web.server.SecurityWebFilterChain;
import org.springframework.stereotype.Component;

import static org.springframework.security.config.Customizer.withDefaults;

@Configuration
@EnableWebFluxSecurity
public class SecurityConfig {

    @Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        http.authorizeExchange(exchanges -> exchanges.anyExchange().authenticated())
                .oauth2Login(withDefaults());
        http.csrf().disable();
        return http.build();
    }

}

In application.yml Stellen Sie die Authentifizierung bei oauth2 ein und leiten Sie sie an den API-Server weiter. Die Einstellungen für keycloak finden Sie unten in der keycloak-Verwaltungskonsole.

http://localhost:8080/auth/realms/myrealm/.well-known/openid-configuration

application.yml

server:
  port: 8082
  servlet:
    context-path: gw

spring:
  cloud:
    gateway:
      routes:
        - id: path_route
          uri: http://localhost:8081
          predicates:
            - Path=/gw/api/{segment}
          filters:
            - SetPath=/api/{segment}
  security:
    oauth2:
      client:
        provider:
          keycloak:
            token-uri: http://localhost:8080/auth/realms/myrealm/protocol/openid-connect/token
            authorization-uri: http://localhost:8080/auth/realms/myrealm/protocol/openid-connect/auth
            userinfo-uri: http://localhost:8080/auth/realms/myrealm/protocol/openid-connect/userinfo
            user-name-attribute: preferred_username
        registration:
          keycloak-dev:
            provider: keycloak
            client-id: spring-client
            client-secret: d7360530-4071-4a80-96fa-d711144fb3f3
            authorization-grant-type: authorization_code
            redirect-uri: "{baseUrl}/login/oauth2/code/keycloak"

logging.level:
  org.springframework.cloud.gateway: DEBUG
  org.springframework.security: DEBUG
  org.springframework.web.reactive.function.client: TRACE

Erstellen Sie auf der REST-Seite normalerweise einen Controller Beginnen Sie mit 8081.

package com.example.api;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@SpringBootApplication
@RestController
public class ApiApplication {

    public static void main(String[] args) {
        SpringApplication.run(ApiApplication.class, args);
    }

    @GetMapping("/test")
    String home() {
        return "Hello Api";
    }
}

Wenn Sie unten darauf zugreifen, wird der Anmeldebildschirm für den Schlüsselumhang angezeigt.

http://localhost:8082/gw/api/test

スクリーンショット 2020-11-05 21.28.49.png

Melden Sie sich mit myuser / mypwd und an "Hallo Api" wird angezeigt.

Recommended Posts

Oauth2-Authentifizierung mit Spring Cloud Gateway
Konfigurieren Sie Microservices mit Spring Cloud (4): API Gateway
Implementierte Authentifizierungsfunktion mit Spring Security ②
Implementierte Authentifizierungsfunktion mit Spring Security ③
Implementierte Authentifizierungsfunktion mit Spring Security ①
Google Cloud Platform mit Spring Boot 2.0.0
Lassen Sie uns Spring Cloud Gateway ausführlich erklären
Zertifizierung / Autorisierung mit Spring Security & Thymeleaf
DB-Authentifizierung mit Spring Security und Hashing mit BCrypt
Erreichen Sie die BASIC-Authentifizierung mit Spring Boot + Spring Security
Senden Sie nach eindeutiger Authentifizierung mit Spring Cloud Gateway eine Anfrage an das Backend
Empfangen Sie E-Mails mit OAuth 2.0-Authentifizierung in Exchange Online
Fügen Sie mit Spring Security Ihre eigenen Authentifizierungselemente hinzu
[Einführung in Spring Boot] Authentifizierungsfunktion mit Spring Security
Erstellen Sie mit Spring Boot 2.0 einen Spring Cloud Config Server mit Sicherheit
Führen Sie nach der Standardauthentifizierung mit Spring Boot eine beliebige Verarbeitung aus.
Informationen zur Spring Security-Authentifizierung
Spring Cloud Netflix-Memo
Feder mit Kotorin --5 Aktuator
Schreiben wir eine Lambda-Funktion, die Amazon API Gateway in die Spring Cloud-Funktion integriert.
Microservices in Spring Cloud
Selbstgemachte Validierung mit Spring
Frühling mit Kotorin ―― 1. SPRING INITIALIZR
Mit Spring Boot herunterladen
Suchen Sie mit der Ressourcenhandhabungsfunktion von Spring Cloud AWS nach AWS S3-Ressourcen
Generieren Sie mit Spring Boot einen Barcode
Hallo Welt mit Spring Boot
Java-Konfiguration mit Spring MVC
Implementieren Sie GraphQL mit Spring Boot
Frühling mit Kotorin --- 8. Aufbewahrungsschicht
Beginnen Sie mit Spring Boot
Spring Cloud Stream Demo veröffentlicht
Führen Sie LIFF mit Spring Boot aus
SNS-Login mit Spring Boot
Datei-Upload mit Spring Boot
Spring Boot beginnt mit dem Kopieren
Feder mit Kotorin ―― 7. Serviceschicht
Anmeldefunktion mit Spring Security
Verwenden von Mapper mit Java (Spring)
Spring Boot beginnend mit Docker
Hallo Welt mit Spring Boot
Setzen Sie Cookies mit Spring Boot
Verwenden Sie Spring JDBC mit Spring Boot
Modul mit Spring Boot hinzufügen
Erste Schritte mit Spring Boot
API mit Spring + Vue.js verknüpfen
Erstellen Sie mit Spring Boot einen Mikrodienst
Mail mit Spring Boot verschicken
Intent-Filter reagiert nicht auf die Rückruf-URL der Twitter OAuth-Authentifizierung
Beim Testen der Formularauthentifizierung mit Spring Security tritt ein 404-Fehler auf
Teil 1: Versuchen Sie, die von Spring Security 5 unterstützte OAuth 2.0-Anmeldung mit Spring Boot zu verwenden