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
办法启动类:
@SpringBootApplicationpublic 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 公布