共计 5832 个字符,预计需要花费 15 分钟才能阅读完成。
yue-library 简介
yue-library 是一个基于 SpringBoot 封装的加强库
- 内置丰盛的 JDK 工具
- 主动拆卸了一系列的根底 Bean 与环境配置项
- 疾速构建 SpringCloud 我的项目,让微服务变得更简略
版本更新日志
此版本重点实现:密钥替换加解密 、 加强 Bean 转换能力、JDBC 新增 Elasticsearch-SQL、达梦、PostgreSQL 方言。
新个性
- 【base】ParamUtils 提醒优化,增加谬误起因
- 【base】增加 JSONListConverter 类型转换器从而反对
List<JSONObject>
类型解决(JDBC 实体数据库查问映射时 JSONArray 格局文本数据不反对映射成List<JSONObject>
) - 【base】优化 fastjson bean 转换的 jsonstr 辨认形式
- 【base】加强 DateUtils 与标准 UUID 工具类为 IdUtils 并优化 IdUtils 实现
- 【base】加强 fastjson JavaBean 转换能力,反对 Character 类型
- 【base】MapUtils 加强值提取,反对 list 依据 key 提取 map 提取值反对 map、fastjson pulls !17
- 【crypto】新增重磅个性 - 密钥替换加密:反对
@RequestDecrypt
注解实现申请主动解密 - 【crypto】新增重磅个性 - 密钥替换加密:反对
@ResponseEncrypt
注解实现响应内容加密 - 【crypto】密钥替换加密:默认提供本地 Map 与 Redis 两种替换密钥存储计划
- 【crypto】密钥替换加密:
@RequestDecrypt
与@ResponseEncrypt
注解反对应用替换密钥加密或自定义密钥等个性 - 【web】修复 ApiVersion 注解 minimumVersion 值等于的状况下 410
- 【web】优化响应后果处理器在规范 HTTP 状态码时的空值解决
- 【web】新增 ServletUtils.getAuthToken()办法,获取申请中的 OAuth2 Token
- 【webflux】修复 ApiVersion 注解 minimumVersion 值等于的状况下 410
- 【jdbc】对 jdbc 方言实现进行欠缺与优化,新增 Elasticsearch-SQL、达梦、PostgreSQL 方言
- 【jdbc】db.queryForObject 自动识别 Bean 类型与简略类型
- 【jdbc】参数丑化加强反对 JSONArray 数据类型与
List<JSONObject>
数据类型 - 【jdbc】优化多行查问后果转换为单行查问后果实现
- 【jdbc】所有 mappedClass 查询方法自动识别所需 RowMapper 类型,实现 JavaBean、map、根本类型后果主动匹配
- 【jdbc】标准外部局部常量命名与移除分页中不优雅的泛型实例 PageTVO
- 【jdbc】加强主动方言辨认,依据驱动类自动识别所需方言类型
- 【jdbc】默认 Db Bean 实现依据不同驱动类型,应用对应方言配置
- 【jdbc】优化 DAO 实现,形象根底 DAO
- 【jdbc】优化所有 jdbc 办法正文,形容更简洁,表白更清晰,正文更标准
- 【jdbc】删除晚期存在的局部过期办法
- 【es】反对配置 ConnectTimeout 与 SocketTimeout,并调大各自默认值为 25 与 15 秒
Bug 修复
- 【base】修复 fastjson JavaBean 转换 BUG #3688
- 【jdbc】修复 isDataSize()办法可能因为数据库存在多行数据,而返回 false 的隐患
- 【jdbc】修复因谬误测试而删除的参数类型丑化(现已反对:Character、JSONObject、LocalDateTime 进行非凡转换解决与布尔值映射辨认)
Maven 仓库理论公布版本号
j8.2.3.2
、j11.2.3.2
要害 pom.xml 依赖:
依赖 | 版本 |
---|---|
spring-boot | 2.3.8.RELEASE |
spring-cloud | Hoxton.SR10 |
spring-cloud-alibaba | 2.2.5.RELEASE |
hutool | 5.6.3 |
fastjson | 1.2.76 |
工程构造
. yue-library
├── yue-library 根底库
│ ├── yue-library-dependencies 父 pom
│ ├── yue-library-base 根底库提供了丰盛的 Java 工具包,同时也主动拆卸了一系列根底 Bean 等
│ ├── yue-library-base-crypto 基于 Hutool 实现的加解密模块,提供诸如数据脱敏此类的更多个性
│ ├── yue-library-web 根底库 WebMvc 实现,用于 servlet 我的项目
│ ├── yue-library-webflux 根底库 WebFlux 实现,用于响应式编程我的项目(如:SpringCloudGateway)│ ├── yue-library-data-jdbc 基于 SpringJDBC 进行二次封装,领有着弱小性能的同时又不失简略、灵便等
│ ├── yue-library-data-redis 基于 SpringRedis 进行二次封装,更简略灵便,提供全局 token 与登录相干个性等
│ ├── yue-library-auth-service 基于 SpringSecurity 进行二次封装,更简略灵便,提供全局 token 与登录等个性
│ ├── yue-library-auth-client auth-client 为 auth-service 客户端模块,提供获取以后登录用户状态信息等个性
│ ├── yue-library-pay 基于 pay-java-parent 进行二次封装,让你真正做到一行代码实现领取聚合
│ ├── yue-library-cloud-oss
│ └── yue-library-cloud-sms
├── yue-library-samples 根底库示例
│ ├── yue-library-test yue-library 代码测试项目:单元测试、接口测试、代码示例
│ ├── yue-library-test-webflux yue-library-webflux 代码测试项目:单元测试、接口测试、代码示例
│ ├── yue-library-template-simple yue-library 模版:SpringBoot 我的项目模版
│ └── yue-library-template-ssc yue-library 模版:SpringCloud 我的项目模版,SOA 共享架构(阿里巴巴中台)└── yue
疾速开始
引入我的项目依赖
maven 我的项目,在 pom.xml 文件中增加如下一段代码,并将 ${version}
替换为对应版本号:
<parent>
<groupId>ai.ylyue</groupId>
<artifactId>yue-library-dependencies</artifactId>
<version>${version}</version>
</parent>
随后引入所须要的模块,如 WebMvc 我的项目引入:yue-library-web
依赖阐明:yue-library-base
为根底模块,个别状况下不须要独自引入,如:web、data-jdbc、data-redis 等模块皆已默认依赖。
<dependencies>
<dependency>
<groupId>ai.ylyue</groupId>
<artifactId>yue-library-web</artifactId>
</dependency>
...
</dependencies>
启动我的项目
新建一个 SpringBoot main
办法启动类:
@SpringBootApplication
public class TestApplication {public static void main(String[] args) throws Exception {SpringApplication.run(TestApplication.class, args);
}
}
写一个测试接口:
@RestController
@RequestMapping("/quickstart")
public class QuickstartController {@GetMapping("/get")
public Result<?> get(JSONObject paramJson) {return ResultInfo.success(paramJson);
}
}
拜访接口测试,如:http://localhost:8080/quickst…
{
"code": 200,
"msg": "胜利",
"flag": true,
"count": null,
"data": {}}
密钥替换
密钥替换加密能够实现如下几个个性:
- 每次会话的密钥时随机的,客户端与服务端当时无需约定
- 密钥未间接存储在客户端与服务端中,防止了泄露危险
- 密钥替换过程中,密钥的传输是加密的
密钥替换流程
密钥替换步骤一:客户端申请传输加密公钥
-
客户端应用密钥存储 key,申请取得服务端公钥(用于步骤二申请加密)
- 密钥存储 key:作为会话惟一键,在步骤一、步骤二、步骤三中属于必填参数
- 密钥存储 key:在用户未登录时个别会随机生成一个 UUID,用户登陆后再用 token 作为别名
- 密钥存储 key:用户已登录状况,个别会以用户本次会话 token 作为存储 key
- 服务端收到申请后,生成用于后续传输加解密的公私钥并绑定存储 key
- 服务端将生成的公钥返回给客户端
密钥替换步骤二:客户端申请最终替换密钥
- 客户端取得服务端的公钥后,创立客户端本身的公私钥
- 客户端应用 服务端的公钥 加密 本身生成的公钥,向服务端申请最终的替换密钥
- 服务端应用私钥解密取得客户端公钥
- 服务端生成最终替换密钥,并应用客户端公钥进行响应加密
- 客户端取得加密的替换密钥后应用 客户端私钥解密,取得替换密钥
密钥替换步骤三(可选):客户端为服务端密钥的存储 key 增加别名
-
实用场景:
- 步骤一时用户未登录,应用长期的 UUID 作为服务端密钥存储 key,用户登录后想应用 token 作为密钥存储 key,不便后续传输
应用替换密钥加解密
-
客户端取得替换密钥后,申请须要参数加密的接口时,以约定的形式带上密钥存储 key,并加密申请参数
- 约定形式:默认为 OAuth2 Token 认证,故:若步骤一应用 UUID 作为存储 key,需将 token 增加为存储别名
- 约定形式:除默认形式外反对:Header 传参约定、URL Param 传参约定(具体传参 key 为服务端定义,默认 key 值:
Yue-ExchangeKey-StorageKey
)
- 服务端解密参数解决业务逻辑后,应用
@ResponseEncrypt
注解主动加密响应的 data 参数 - 客户端解密响应后果
接口阐明
默认算法名称
-
RSA_AES:
/** RSA 算法,此算法用了默认补位形式为 RSA/ECB/PKCS1Padding */ RSA_ECB_PKCS1("RSA/ECB/PKCS1Padding"), /** 默认的 AES 加密形式:AES/ECB/PKCS5Padding */ AES("AES"),
-
SM2_SM4
/** * 算法 EC */ private static final String ALGORITHM_SM2 = "SM2"; public static final String ALGORITHM_NAME = "SM4";
密钥替换 - 第一步:取得加密公钥
接口地址:POST /open/v2.3/keyExchange/{storageKey}
参数 | 阐明 | 参数示例 |
---|---|---|
storageKey | RESTful 门路参数,密钥存储 key | 23ef1f9418e84cc884187e1720ac1529 |
exchangeKeyType | 替换密钥类型,枚举值:RSA_AES、SM2_SM4 | RSA_AES |
密钥替换 - 第二步:取得替换密钥
接口地址:POST /open/v2.3/keyExchange/{storageKey}
参数 | 阐明 | 参数示例 |
---|---|---|
storageKey | RESTful 门路参数,密钥存储 key | 23ef1f9418e84cc884187e1720ac1529 |
exchangeKeyType | 替换密钥类型,枚举值:RSA_AES、SM2_SM4 | RSA_AES |
encryptedClientPublicKey | 应用服务端公钥加密的客户端公钥(encryptBase64) | SsowXMaZfQiec39 .. 略 n.. uv/DbVr6gslrjY3Q== |
密钥替换 - 第三步:增加存储 key 别名
接口地址:POST /open/v2.3/keyExchange/{storageKey}/addAlias
参数 | 阐明 | 参数示例 |
---|---|---|
storageKey | RESTful 门路参数,密钥存储 key | 23ef1f9418e84cc884187e1720ac1529 |
storageKeyAlias | 存储别名 | cbf55767c47e4d4e9feb90cfa2bdf5aa |
配置
yue:
crypto:
key-exchange:
enabled: true # 默认 false,启用密钥替换
key-exchange-storage-type: redis # 应用 redis 作为密钥替换存储类型
注解应用阐明
@RequestDecrypt
申请解密注解:
- 必须与
@RequestBody
注解一起应用 @RequestBody
注解只反对应用 Body 传参,并映射为实体参数。-
Content-Type=application/json;charset=UTF-8
@RequestDecrypt @PostMapping("/decrypt") public Result<?> decrypt(@RequestBody UserIPO userIPO) {return R.success(userIPO); }
@ResponseEncrypt
响应加密注解:
- 必须与
@ResponseBody
注解一起应用,@RestController
注解默认已集成@ResponseBody
-
必须应用
Result
作为返回类型,并且加密的是 data 参数@ResponseEncrypt @GetMapping("/{encrypt}") public Result<?> encrypt(@PathVariable String encrypt) {return R.success(encrypt); }
珍藏一波以表反对吧(≧▽≦)/!
本文由博客群发一文多发等经营工具平台 OpenWrite 公布