使用Spring Cloud Gateway进行OAuth2认证
以下是原始资料。
我试着使用Spring Cloud Gateway作为一个类似于防火墙的东西,虽然它似乎是用于使用微服务的。
构成
下面我会使用以下两个服务:
[云网关]
[API]
通过[云网关]访问REST服务器的API。[云网关]需要进行OAuth2认证。
OAuth2认证服务器
使用Docker启动Keycloak。
使用Docker启动keycloak服务器。
以下选择了Docker Compose中的postgresql。
以下是Keycloak控制台的基本操作:
https://www.keycloak.org/getting-started/getting-started-docker
用户们,为了持久化keycloak设置,将连接本地的postgresql(同样是通过Docker连接)。参照以下内容进行操作。
docker-compose.yml的内容如下。
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
创建领域、客户端和用户
在下面打开Keycloak的管理控制台。
账户和密码在docker-compose.yml文件中。
登录后将显示如下画面。

设定如下:
王国:我的王国
客户端ID:spring-client
访问类型:保密
有效的重定向URL:
http://localhost:8082/*
用户名:我的用户名
资格/证书
我的用户名和密码
Spring Cloud 网关
请提供以下内容的中文本地化版本,只需一个选项:
参考资料
我参考了以下网站的内容,对pom.xml和config进行了设置。
由于Spring Cloud Gateway采用了Webflux,所以可以如下所示。
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>
在使用WebFlux和Spring Security时,需要使用@EnableWebFluxSecurity注解。
安全配置.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();
}
}
在application.yml中,配置oauth2认证并将其路由到API服务器。
有关Keycloak的配置可以在Keycloak管理控制台中参考以下信息。
应用程序配置文件.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
REST侧通常会创建控制器,并在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";
}
}
当您访问以下网址时,将会显示 Keycloak 的登录界面。

使用myuser/mypwd登录后,将显示「Hello Api」。