[JAVA] Authentification Oauth2 avec Spring Cloud Gateway

La source est la suivante.

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

Passerelle Spring Cloud Je pense qu'il sera utilisé comme un micro service Je me suis demandé s'il pouvait simplement être utilisé comme un pare-feu.

Constitution

Les deux services suivants sont utilisés. [cloud-gateway] [api]

Via [cloud-gateway] Accédez au serveur REST [api]. [cloud-gateway] nécessite une authentification oauth2.

Serveur d'autorisation OAuth2

Lancez Keycloak avec Docker

Démarrez le serveur keycloak avec Docker. Ci-dessous, postgresql est sélectionné dans Docker Compose.

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

Le fonctionnement de base de la console Keycloak est le suivant. https://www.keycloak.org/getting-started/getting-started-docker

Pour conserver les paramètres de keycloak, tels que les utilisateurs Connectez-vous à votre postgresql local (également Docker). J'ai évoqué ce qui suit.

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

docker-compose.yml est comme suit, y compris le contenu ci-dessus.


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

Création d'un royaume, d'un client, d'un utilisateur

Ouvrez la console de gestion Keycloak ci-dessous. Akapas est dans docker-compose.yml.

http://localhost:8080/auth/admin

Lorsque vous vous connectez, vous verrez cet écran.

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

Réglez comme suit.

Realm:myrealm

Client ID:spring-client

Access type:confidential

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

username:myuser

Credentials

myuser/mypwd

Spring Cloud Gateway

référence

J'ai défini pom.xml et config en me référant au site suivant.

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

Puisque spring-cloud-gateway est Webflux, ce qui suit.

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>

Avec WebFlux, Spring Security Nécessite @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();
    }

}

Dans application.yml Configuré pour s'authentifier avec oauth2 et acheminer vers le serveur API. Les paramètres relatifs à keycloak se trouvent ci-dessous dans la console de gestion de keycloak.

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

Du côté REST, créez un contrôleur normalement Commencez par 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";
    }
}

Si vous accédez ci-dessous, l'écran de connexion Keycloak s'affiche.

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

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

Connectez-vous avec myuser / mypwd et "Hello Api" s'affiche.

Recommended Posts

Authentification Oauth2 avec Spring Cloud Gateway
Configurer des microservices avec Spring Cloud (4): API Gateway
Mise en œuvre de la fonction d'authentification avec Spring Security ②
Implémentez la fonction d'authentification avec Spring Security ③
Mise en œuvre de la fonction d'authentification avec Spring Security ①
Google Cloud Platform avec Spring Boot 2.0.0
Expliquons en détail Spring Cloud Gateway
Certification / autorisation avec Spring Security & Thymeleaf
Authentification DB avec Spring Security et hachage avec BCrypt
Obtenez une authentification BASIC avec Spring Boot + Spring Security
Envoyez une demande au backend après une authentification unique avec Spring Cloud Gateway
Recevoir des e-mails avec l'authentification OAuth 2.0 sur Exchange Online
Ajoutez vos propres éléments d'authentification avec Spring Security
[Introduction à Spring Boot] Fonction d'authentification avec Spring Security
Créez un serveur Spring Cloud Config en toute sécurité avec Spring Boot 2.0
Exécutez un traitement arbitraire après l'authentification de base avec Spring Boot.
À propos de l'authentification Spring Security
Mémo Spring Cloud Netflix
Ressort avec actionneur Kotorin --5
Écrivons une fonction Lambda qui intègre Amazon API Gateway à Spring Cloud Function.
Microservices dans Spring Cloud
Validation personnalisée avec Spring
Printemps avec Kotorin ―― 1. INITIALISATION PRINTEMPS
Télécharger avec Spring Boot
Rechercher des ressources AWS S3 avec la fonctionnalité de gestion des ressources de Spring Cloud AWS
Générer un code à barres avec Spring Boot
Hello World avec Spring Boot
Configuration Java avec Spring MVC
Implémenter GraphQL avec Spring Boot
Spring with Kotorin --- 8. Couche de référentiel
Démarrez avec Spring Boot
Sortie de la démo Spring Cloud Stream
Exécutez LIFF avec Spring Boot
Connexion SNS avec Spring Boot
Téléchargement de fichiers avec Spring Boot
Spring Boot commençant par copie
Ressort avec Kotorin ―― 7. Couche de service
Fonction de connexion avec Spring Security
Utilisation de Mapper avec Java (Spring)
Spring Boot à partir de Docker
Hello World avec Spring Boot
Définir des cookies avec Spring Boot
Utiliser Spring JDBC avec Spring Boot
Ajouter un module avec Spring Boot
Premiers pas avec Spring Boot
Lier l'API avec Spring + Vue.js
Créer un micro service avec Spring Boot
Envoyer du courrier avec Spring Boot
Le filtre d'intention ne répond pas à l'URL de rappel d'authentification Twitter OAuth
Une erreur 404 se produit lors du test de l'authentification par formulaire avec Spring Security
Partie 1: Essayez d'utiliser la connexion OAuth 2.0 prise en charge par Spring Security 5 avec Spring Boot