以下是 “Spring Gateway + Oauth2 实现单点登录及详细配置”的完整攻略。
1. 概述
单点登录(Single Sign-On,简称 SSO)是企业级应用系统中经常用到的功能之一。在现代应用架构中,前后端的分离和微服务架构的流行,使得如何实现 SSO 变得更为复杂。本文将详细介绍如何使用 Spring Gateway 和 Spring Security OAuth2 实现 SSO,以及相关配置详解和示例代码。
2. 实现步骤
2.1 加载依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>
2.2 配置 Security 集成 OAuth2
在配置 Spring Security 集成 OAuth2 之前,需要先确定你的认证服务器(即 Authorization Server)的地址和所需的参数。比如,我们已经有一个 OAuth2 服务器的 IP 地址为 127.0.0.1:8080/oauth/authorize,客户端 ID 为 gateway-client,客户端 Secret 为 gateway-secret。
在配置过程中,需要注意以下参数:
security.oauth2.client.client-id
:客户端 ID。security.oauth2.client.client-secret
:客户端 Secret。security.oauth2.client.user-authorization-uri
:认证服务器地址。security.oauth2.client.access-token-uri
:请求 token 的地址。security.oauth2.client.grant-type
:授权方式,一般为authorization_code
。security.oauth2.client.scope
:请求的权限范围,一般为read
和write
。security.oauth2.resource.user-info-uri
:获取用户信息的地址。
配置文件示例:
security:
oauth2:
client:
client-id: gateway-client
client-secret: gateway-secret
user-authorization-uri: http://127.0.0.1:8080/oauth/authorize
access-token-uri: http://127.0.0.1:8080/oauth/token
grant-type: authorization_code
scope: read,write
resource:
user-info-uri: http://127.0.0.1:8080/user
2.3 配置 Gateway
在配置 Gateway 之前,需要确定每一个需要认证的服务的路由规则和需要过滤的路径。在 Gateway 中,可以通过配置 Filter 实现对请求的拦截和处理。可以使用 Spring Security OAuth2 提供的 OAuth2GatewayFilterFactory 实现过滤器的配置。
在配置过程中,需要注意以下参数:
issuer-uri
:认证服务器地址。token-uri
:请求 token 的地址。use-current-uri
:是否使用当前请求的 URI。redirect-uri
:Redirect URL。一般为 http://localhost:8080/login 或者是认证服务返回的默认 URL。client-id
:客户端 ID。client-secret
:客户端 Secret。route-id
:路由规则 ID。
配置文件示例:
spring:
cloud:
gateway:
routes:
- id: auth-service
uri: http://localhost:8081
predicates:
- Path=/auth/**
filters:
- OAuth2=auth-service
- id: user-service
uri: http://localhost:8082
predicates:
- Path=/user/**
filters:
- OAuth2=user-service
security:
oauth2:
client:
client-id: gateway-client
client-secret: gateway-secret
user-authorization-uri: http://127.0.0.1:8080/oauth/authorize
access-token-uri: http://127.0.0.1:8080/oauth/token
grant-type: authorization_code
scope: read,write
resource:
user-info-uri: http://127.0.0.1:8080/user
spring:
security:
oauth2:
client:
registration:
auth-service:
client-id: gateway-client
client-secret: gateway-secret
client-name: auth-service
scope: read, write
provider: oauth2-provider
redirect-uri-template: "{baseUrl}/login/oauth2/code/{registrationId}"
authorization-grant-type: authorization_code
client-authentication-method: POST
user-service:
client-id: gateway-client
client-secret: gateway-secret
client-name: user-service
scope: read, write
provider: oauth2-provider
redirect-uri-template: "{baseUrl}/login/oauth2/code/{registrationId}"
authorization-grant-type: authorization_code
client-authentication-method: POST
provider:
oauth2-provider:
authorization-uri: http://127.0.0.1:8080/oauth/authorize
token-uri: http://127.0.0.1:8080/oauth/token
user-info-uri: http://127.0.0.1:8080/user
user-name-attribute: name
3. 示例
3.1 示例一(Spring Security OAuth2)
- 启动 OAuth2 服务器,使用默认端口 8080。
- 启动用户服务,使用端口 8082。
- 启动网关,使用端口 8080。
- 在浏览器中访问 http://localhost:8080/user/1,输入用户名和密码,并成功认证之后,会重定向到原始请求地址 http://localhost:8080/user/1。
3.2 示例二(Keycloak)
- 在服务器上安装 Keycloak,并进行简单的配置。
- 在 Keycloak 中添加一个 OpenID 连接器,描述了你的认证服务器应该如何与 Spring Gateway 集成。
- 修改 Gateway 的配置文件,以使用上述连接器和 Keycloak 进行认证。
- 启动网关和用户服务,测试是否可以进行 SSO 认证。
参考资料:
[1] https://www.baeldung.com/sso-spring-security-oauth2
[2] https://www.baeldung.com/spring-security-oauth2-keycloak
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring gateway + Oauth2实现单点登录及详细配置 - Python技术站