## Spring Cloud 单点登录### 简介在现代微服务架构中,应用程序通常被拆分成多个独立的服务,每个服务都有自己的认证和授权机制。这导致用户需要在访问不同服务时重复登录,降低了用户体验。单点登录(Single Sign-On,SSO)应运而生,它允许用户只需登录一次,就可以访问所有相互信任的服务。本文将详细介绍如何使用 Spring Cloud 实现单点登录。### 1. 架构设计一个典型的 Spring Cloud 单点登录架构包含以下组件:
认证服务器(Authorization Server):
负责用户认证、生成和校验 Token。
资源服务器(Resource Server):
提供受保护的资源,需要验证 Token 的有效性。
客户端应用程序(Client Application):
访问资源服务器,并处理用户登录和 Token 交互。#### 1.1 认证流程1. 用户访问客户端应用程序。
2. 客户端应用程序将用户重定向到认证服务器进行登录。
3. 用户输入用户名和密码进行身份验证。
4. 认证服务器验证用户信息,并生成访问令牌(Access Token)。
5. 认证服务器将访问令牌返回给客户端应用程序。
6. 客户端应用程序使用访问令牌访问资源服务器。
7. 资源服务器验证访问令牌,并返回受保护的资源。### 2. 技术选型
Spring Security OAuth2:
提供 OAuth2 协议的实现,用于构建认证服务器和资源服务器。
Spring Cloud Security:
简化了 Spring Security OAuth2 的配置和使用,并提供与 Spring Cloud 的集成。
JWT(JSON Web Token):
一种常用的 Token 格式,用于安全地传输用户信息。### 3. 实现步骤#### 3.1 搭建认证服务器1. 添加依赖:```xml
org.springframework.cloudspring-cloud-starter-oauth2
```2. 创建授权服务器配置类:```java
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {@Autowiredprivate AuthenticationManager authenticationManager;@Overridepublic void configure(ClientDetailsServiceConfigurer clients) throws Exception {// 配置客户端应用程序clients.inMemory().withClient("client-app").secret("{noop}secret").authorizedGrantTypes("password", "refresh_token").scopes("read", "write").accessTokenValiditySeconds(3600).refreshTokenValiditySeconds(2592000);}@Overridepublic void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {endpoints.authenticationManager(authenticationManager).tokenStore(tokenStore()); // 使用 JWT token}@Beanpublic TokenStore tokenStore() {return new JwtTokenStore(accessTokenConverter());}@Beanpublic JwtAccessTokenConverter accessTokenConverter() {JwtAccessTokenConverter converter = new JwtAccessTokenConverter();// 设置 JWT 签名密钥converter.setSigningKey("secret");return converter;}
}
```#### 3.2 搭建资源服务器1. 添加依赖:```xml
org.springframework.cloudspring-cloud-starter-oauth2
```2. 创建资源服务器配置类:```java
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {@Overridepublic void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated();}
}
```#### 3.3 搭建客户端应用程序1. 添加依赖:```xml
org.springframework.cloudspring-cloud-starter-security
```2. 创建安全配置类:```java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().oauth2Client();}
}
```### 4. 测试启动认证服务器、资源服务器和客户端应用程序,并尝试访问资源服务器的受保护资源。### 5. 总结本文介绍了如何使用 Spring Cloud 实现单点登录。通过搭建认证服务器、资源服务器和客户端应用程序,并使用 OAuth2 协议进行认证和授权,我们可以轻松地实现用户只需登录一次,即可访问所有相互信任的服务。
Spring Cloud 单点登录
简介在现代微服务架构中,应用程序通常被拆分成多个独立的服务,每个服务都有自己的认证和授权机制。这导致用户需要在访问不同服务时重复登录,降低了用户体验。单点登录(Single Sign-On,SSO)应运而生,它允许用户只需登录一次,就可以访问所有相互信任的服务。本文将详细介绍如何使用 Spring Cloud 实现单点登录。
1. 架构设计一个典型的 Spring Cloud 单点登录架构包含以下组件:* **认证服务器(Authorization Server):** 负责用户认证、生成和校验 Token。
* **资源服务器(Resource Server):** 提供受保护的资源,需要验证 Token 的有效性。
* **客户端应用程序(Client Application):** 访问资源服务器,并处理用户登录和 Token 交互。
1.1 认证流程1. 用户访问客户端应用程序。
2. 客户端应用程序将用户重定向到认证服务器进行登录。
3. 用户输入用户名和密码进行身份验证。
4. 认证服务器验证用户信息,并生成访问令牌(Access Token)。
5. 认证服务器将访问令牌返回给客户端应用程序。
6. 客户端应用程序使用访问令牌访问资源服务器。
7. 资源服务器验证访问令牌,并返回受保护的资源。
2. 技术选型* **Spring Security OAuth2:** 提供 OAuth2 协议的实现,用于构建认证服务器和资源服务器。
* **Spring Cloud Security:** 简化了 Spring Security OAuth2 的配置和使用,并提供与 Spring Cloud 的集成。
* **JWT(JSON Web Token):** 一种常用的 Token 格式,用于安全地传输用户信息。
3. 实现步骤
3.1 搭建认证服务器1. 添加依赖:```xml
org.springframework.cloudspring-cloud-starter-oauth2
```2. 创建授权服务器配置类:```java
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {@Autowiredprivate AuthenticationManager authenticationManager;@Overridepublic void configure(ClientDetailsServiceConfigurer clients) throws Exception {// 配置客户端应用程序clients.inMemory().withClient("client-app").secret("{noop}secret").authorizedGrantTypes("password", "refresh_token").scopes("read", "write").accessTokenValiditySeconds(3600).refreshTokenValiditySeconds(2592000);}@Overridepublic void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {endpoints.authenticationManager(authenticationManager).tokenStore(tokenStore()); // 使用 JWT token}@Beanpublic TokenStore tokenStore() {return new JwtTokenStore(accessTokenConverter());}@Beanpublic JwtAccessTokenConverter accessTokenConverter() {JwtAccessTokenConverter converter = new JwtAccessTokenConverter();// 设置 JWT 签名密钥converter.setSigningKey("secret");return converter;}
}
```
3.2 搭建资源服务器1. 添加依赖:```xml
org.springframework.cloudspring-cloud-starter-oauth2
```2. 创建资源服务器配置类:```java
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {@Overridepublic void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated();}
}
```
3.3 搭建客户端应用程序1. 添加依赖:```xml
org.springframework.cloudspring-cloud-starter-security
```2. 创建安全配置类:```java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().authenticated().and().oauth2Client();}
}
```
4. 测试启动认证服务器、资源服务器和客户端应用程序,并尝试访问资源服务器的受保护资源。
5. 总结本文介绍了如何使用 Spring Cloud 实现单点登录。通过搭建认证服务器、资源服务器和客户端应用程序,并使用 OAuth2 协议进行认证和授权,我们可以轻松地实现用户只需登录一次,即可访问所有相互信任的服务。