# jarvis-security
**Repository Path**: hancys/jarvis-security
## Basic Information
- **Project Name**: jarvis-security
- **Description**: 基于 Spring Security 5 的无状态后端服务的安全框架,引入相应模块可支持QQ等第三方登录。基于 jarvis-security-social 模块,可快速开发自定义的第三方 OAuth2.0 登录模块。
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 3
- **Created**: 2025-08-22
- **Last Updated**: 2025-08-22
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
[](https://central.sonatype.com/artifact/io.github.benfromchina/jarvis-security)
[](https://gitee.com/jarvis-lib/jarvis-security/releases/v2.0.2)
[](https://www.oracle.com/cn/java/technologies/downloads/#java17)
[](https://docs.spring.io/spring-authorization-server/reference/index.html)
[](https://github.com/spring-projects/spring-boot/tree/v3.3.2)
[](https://docs.spring.io/spring-cloud-release/reference/index.html)
[](https://github.com/spring-projects/spring-framework/tree/v6.1.11)
### 目录
- [介绍](#介绍)
- [简介](#简介)
- [架构](#架构)
- [功能](#功能)
- [HttpSecurityConfigurer 替换 WebSecurityConfigurerAdapter 配置 HttpSecurity](#httpsecurityconfigurer-替换-websecurityconfigureradapter-配置-httpsecurity)
- [配置不需要认证授权的请求](#配置不需要认证授权的请求)
- [OAuth2.0第三方登录](#oauth20第三方登录)
- [QQ](#qq)
- [支付宝](#支付宝)
- [开源中国](#开源中国)
- [基于`jarvis-security-social`快速开发第三方登录](#基于jarvis-security-social快速开发第三方登录)
- [OAuth2.0流程图](#oauth20流程图)
- [必选的接口](#必选的接口)
- [客户端注册构造器](#客户端注册构造器)
- [封装用户信息对象](#封装用户信息对象)
- [可选的接口](#可选的接口)
- [`1`步骤中获取授权码请求参数自定义](#1步骤中获取授权码请求参数自定义)
- [`4.1`步骤中返回的授权码参数名不叫`code`](#41步骤中返回的授权码参数名不叫code)
- [`5`步骤中获取令牌请求参数自定义](#5步骤中获取令牌请求参数自定义)
- [`6`步骤中获取令牌响应参数处理](#6步骤中获取令牌响应参数处理)
- [`5`到`6`获取令牌过程自定义](#5到6获取令牌过程自定义)
- [`6.1`步骤中获取用户信息请求参数自定义](#61步骤中获取用户信息请求参数自定义)
- [`7`步骤中获取用户信息响应参数处理](#7步骤中获取用户信息响应参数处理)
- [`6.1`到`7`获取用户信息过程自定义](#61到7获取用户信息过程自定义)
- [持久化用户第三方登录信息](#持久化用户第三方登录信息)
### 介绍
#### 简介
`jarvis-security`是一个基于`Spring Authorization Server`的**无状态**的**后端服务**的**安全框架**,旨在通过简单的配置,实现`Spring Authorization Server`的功能,并可以简单快速地扩展其他的授权方式。
#### 架构
```
jarvis-security // 父模块,统一维护依赖版本、公共配置属性、maven 插件配置等,供其他模块引用和继承
├── jarvis-security-oauth2-authorization-server // 基于 Spring Authorization Server 实现的授权服务器
├── jarvis-security-oauth2-authorization-core // 核心包,基于该模块可扩展自定义的 OAuth2.0 授权方式
├── jarvis-security-oauth2-authorization-password // 支持密码模式登录
├── jarvis-security-oauth2-authorization-sms // 支持短信验证码模式登录
└── jarvis-security-oauth2-authorization-wxmp // 支持微信小程序模式登录
```
### 功能
#### 配置授权服务器
1. 引入依赖
```xml
io.github.benfromchina
jarvis-security-oauth2-authorization-server
2.0.4
```
2. 实现 `UsernameUserDetailsServiceProvider` 接口,用于根据用户名获取用户信息
```java
@Component
@AllArgsConstructor
public class UsernameUserDetailsServiceProviderImpl implements UsernameUserDetailsServiceProvider {
private final UserService userService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserDTO user = userService.getByUsername(username).orElseThrow(() -> new UsernameNotFoundException("用户名不存在"));
return userToUserDetails(user); // 业务系统用户转换为 UserDetails
}
}
```
3. 实现 `RegisteredClientRepository` 接口,用于 OAuth2.0 客户端信息存储
```java
@Component
@AllArgsConstructor
public class RegisteredClientServiceImpl implements RegisteredClientRepository {
private final ClientService clientService;
@Override
public void save(RegisteredClient registeredClient) {
// TODO: 保存客户端信息
}
@Override
public RegisteredClient findById(String id) {
// 注意抛出异常类型必须为 OAuth2AuthenticationException
ClientDTO client = clientService.get(id).orElseThrow(() -> new OAuth2AuthenticationException(OAuth2ErrorCodes.INVALID_CLIENT));
return clientToRegisteredClient(client); // 业务系统客户端转换为 RegisteredClient
}
@Override
public RegisteredClient findByClientId(String clientId) {
// 注意抛出异常类型必须为 OAuth2AuthenticationException
ClientDTO client = clientService.getByClientId(clientId).orElseThrow(() -> new OAuth2AuthenticationException(OAuth2ErrorCodes.INVALID_CLIENT));
return clientToRegisteredClient(client); // 业务系统客户端转换为 RegisteredClient
}
}
```
3.
#### 配置不需要认证授权的请求
1. 配置文件方式
```yml
spring:
security:
permit-all-requests:
- path: /actuator/health
method: GET
- path: /path_all_methods
```
2. 实现`PermitAllRequestsSupplier`接口
```java
@Component
public class PermitAllRequestsSupplierImpl implements PermitAllRequestsSupplier {
@Override
public List get() {
List requests = new ArrayList<>();
// 指定请求方式
requests.add(new SecurityProperties.Request("/actuator/health", SecurityProperties.HttpMethod.GET));
// 所有请求方式
requests.add(new SecurityProperties.Request("/path_all_methods"));
return requests;
}
}
```
#### 存储授权信息实现强制下线
实现 `OAuth2AuthorizationService` 接口,除了官方的 `InMemoryOAuth2AuthorizationService` 和 `JdbcOAuth2AuthorizationService` 之外,内置了 `RedisOAuth2AuthorizationService` 。
```java
@Configuration
public class AuthServerConfig {
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Autowired
private SecurityProperties securityProperties;
@Bean
public OAuth2AuthorizationService oauth2AuthorizationService() {
return new RedisOAuth2AuthorizationService(redisTemplate(), securityProperties);
}
@Bean
public RedisTemplate