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.2j11.2.3.2

要害pom.xml依赖:

依赖版本
spring-boot2.3.8.RELEASE
spring-cloudHoxton.SR10
spring-cloud-alibaba2.2.5.RELEASE
hutool5.6.3
fastjson1.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": {}}

密钥替换

密钥替换加密能够实现如下几个个性:

  • 每次会话的密钥时随机的,客户端与服务端当时无需约定
  • 密钥未间接存储在客户端与服务端中,防止了泄露危险
  • 密钥替换过程中,密钥的传输是加密的

密钥替换流程

密钥替换步骤一:客户端申请传输加密公钥

  1. 客户端应用密钥存储key,申请取得服务端公钥(用于步骤二申请加密)

    • 密钥存储key:作为会话惟一键,在步骤一、步骤二、步骤三中属于必填参数
    • 密钥存储key:在用户未登录时个别会随机生成一个UUID,用户登陆后再用token作为别名
    • 密钥存储key:用户已登录状况,个别会以用户本次会话token作为存储key
  2. 服务端收到申请后,生成用于后续传输加解密的公私钥并绑定存储key
  3. 服务端将生成的公钥返回给客户端

密钥替换步骤二:客户端申请最终替换密钥

  1. 客户端取得服务端的公钥后,创立客户端本身的公私钥
  2. 客户端应用服务端的公钥加密本身生成的公钥,向服务端申请最终的替换密钥
  3. 服务端应用私钥解密取得客户端公钥
  4. 服务端生成最终替换密钥,并应用客户端公钥进行响应加密
  5. 客户端取得加密的替换密钥后应用客户端私钥解密,取得替换密钥

密钥替换步骤三(可选):客户端为服务端密钥的存储key增加别名

  • 实用场景:

    • 步骤一时用户未登录,应用长期的UUID作为服务端密钥存储key,用户登录后想应用token作为密钥存储key,不便后续传输

应用替换密钥加解密

  1. 客户端取得替换密钥后,申请须要参数加密的接口时,以约定的形式带上密钥存储key,并加密申请参数

    • 约定形式:默认为OAuth2 Token认证,故:若步骤一应用UUID作为存储key,需将token增加为存储别名
    • 约定形式:除默认形式外反对:Header传参约定、URL Param传参约定(具体传参key为服务端定义,默认key值:Yue-ExchangeKey-StorageKey
  2. 服务端解密参数解决业务逻辑后,应用@ResponseEncrypt注解主动加密响应的data参数
  3. 客户端解密响应后果

接口阐明

默认算法名称

  • 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}
参数阐明参数示例
storageKeyRESTful门路参数,密钥存储key23ef1f9418e84cc884187e1720ac1529
exchangeKeyType替换密钥类型,枚举值:RSA_AES、SM2_SM4RSA_AES

密钥替换-第二步:取得替换密钥

接口地址:POST /open/v2.3/keyExchange/{storageKey}
参数阐明参数示例
storageKeyRESTful门路参数,密钥存储key23ef1f9418e84cc884187e1720ac1529
exchangeKeyType替换密钥类型,枚举值:RSA_AES、SM2_SM4RSA_AES
encryptedClientPublicKey应用服务端公钥加密的客户端公钥(encryptBase64)SsowXMaZfQiec39 ..略n.. uv/DbVr6gslrjY3Q==

密钥替换-第三步:增加存储key别名

接口地址:POST /open/v2.3/keyExchange/{storageKey}/addAlias
参数阐明参数示例
storageKeyRESTful门路参数,密钥存储key23ef1f9418e84cc884187e1720ac1529
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 公布