一个注解搞定SpringBoot接口定制属性加解密
前言
上个月公司另一个团队做的新项目上线后大体上运行稳定,但包括研发负责人在内的两个人在项目上线后立马就跳槽了,然后又交接给了我这个「垃圾回收人员」。
本周甲方另一个厂家的监控平台扫描到我们这个项目某些接口的一些敏感信息没有做加密,要求我们立马处理。
检查了一下发现还真是这样,手机、身份证号什么的都没脱敏,心里顿时一万头神兽在奔腾。
还好,我有长期应对这类突发事情的经验,直接写了一个自定义注解,然后在需要加解密的接口上加上,和前端一联调,欧克搞定,之后脸上保持沉重,但内心淡定摸鱼,好不潇洒。
趁着摸鱼的空闲,我把实现方法简化后用最易懂的方式分享出来,大家可以收藏一下,哪天用得上可以捞出来瞅瞅,节省点思考的时间。
技术版本
实现过程
1、引入依赖
2、实体类
我们定义两个实体类,一个是模拟查询用户信息时接口响应返回的对象UserInfo。
一个是保存用户时的请求对象UserInfoReq
这样,我们就可以分别来测试一下查询接口返回对象敏感属性加密的情况,和保存接口请求对象敏感属性解密的情况了。
3、yml配置
这里,我们主要加上密钥的自定义配置,便于灵活修改。
4、自定义注解
这里,我们给注解定义了两个参数,分别是请求时要给哪些属性解密,以及响应时要给哪些属性加密,并分别给了默认值。
5、加解密工具类
加解密工具类我们使用了Hutool提供的AES加解密工具
这里注意两点:
1)、工具类中获取yml配置,要加上@component注解,然后给变量设置static,但set方法去掉static,@Value获取放在set方法上即可,否则不会生效;
2)、构建AES工具要放在@PostConstruct注解中,表示Spring容器初始化这个Bean之后加载的内容,不这样处理直接构建的话会抛出空指针异常。
6、AOP切面
这里是自定义注解的AOP切面类,也是具体实现,核心思想还是利用Java的反射机制,其中的一些写法大体都是固定的,可以适当理解,不建议过分领悟,以免造成困扰。
7、测试接口
首先,我们来测试一下查询接口,针对返回对象的部分敏感属性进行加密。
这里,我们设置reqPropsName={},表示不对请求参数做加解密操作,设置respPropsName={"phone"、"idCard"、"name"},表示对返回对象中的手机号、身份证号、姓名进行加密返回。
其次,我们来测试一下保存接口,针对请求对象的部分已加密属性进行解密。
这里,我们设置reqPropsName={"phone"、"idCard"、"name"},表示对请求参数中的手机号、身份证号、姓名做解密操作,设置respPropsName={},表示对返回对象不做加密操作。
保存接口执行后我们直接返回这个对象就行,看看是不是已经解密了。
8、效果
查询接口返回对象加密效果
保存接口请求对象解密效果
总结
自定义注解可以实现的功能很多,比如之前给大家写过的一篇防重复提交注解,重点是AOP的思想,写法大体上都是固定的。
这里的加解密注解依然有局限性:
1)、只支持有明确公共返回对象的接口,比如这里的Result;
2)、只支持@RequestBody请求对象,其他诸如多个param参数、Map等形式都不支持,可以自行扩展;
虽然不完美,但大体上已经够用,因为大部分SpringBoot项目都是遵循规范的,都会定义公共的返回对象,绝大部分请求接口也都是@RequesetBody来接收的。
AOP切面的实现中,针对请求对象的类型也留下了口子,感兴趣的小伙伴可以下载源码自行扩展,拿来练习都是不错的选择。
源码会在评论区中给出来哦~
原创文章纯手打,觉得有一滴滴帮助就请举手之劳点个推荐吧~
持续分享工作中的真实经验和心得体会,喜欢的话就点个关注吧~
一个注解搞定SpringBoot接口定制属性加解密的更多相关文章
- Spring Security基于Oauth2的SSO单点登录怎样做?一个注解搞定
一.说明 单点登录顾名思义就是在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统,免除多次登录的烦恼.本文主要介绍 同域 和 跨域 两种不同场景单点登录的实现原理,并使用 Spring ...
- 搞定SpringBoot多数据源(1):多套源策略
目录 1. 引言 2. 运行环境 3. 多套数据源 3.1 搭建 Spring Boot 工程 3.1.1 初始化 Spring Boot 工程 3.1.2 添加 MyBatis Plus 依赖 3. ...
- 搞定SpringBoot多数据源(2):动态数据源
目录 1. 引言 2. 动态数据源流程说明 3. 实现动态数据源 3.1 说明及数据源配置 3.1.1 包结构说明 3.1.2 数据库连接信息配置 3.1.3 数据源配置 3.2 动态数据源设置 3. ...
- 搞定SpringBoot多数据源(3):参数化变更源
目录 1. 引言 2. 参数化变更源说明 2.1 解决思路 2.2 流程说明 3. 实现参数化变更源 3.1 改造动态数据源 3.1.1 动态数据源添加功能 3.1.2 动态数据源配置 3.2 添加数 ...
- 将你的前端应用打包成docker镜像并部署到服务器?仅需一个脚本搞定
1.前言 前段时间,自己搞了个阿里云的服务器.想自己在上面折腾,但是不想因为自己瞎折腾而污染了现有的环境.毕竟,现在的阿里云已经没有免费的快照服务了.要想还原的话,最简单的办法就是重新装系统.而一旦重 ...
- Jquery一个slideToggle搞定div的隐藏与显示
Jquery一个slideToggle搞定div的隐藏与显示 <!DOCTYPE html> <html> <head> <script src=" ...
- SpringBoot中如何灵活的实现接口数据的加解密功能?
数据是企业的第四张名片,企业级开发中少不了数据的加密传输,所以本文介绍下SpringBoot中接口数据加密.解密的方式. 本文目录 一.加密方案介绍二.实现原理三.实战四.测试五.踩到的坑 一.加密方 ...
- 一个类搞定UIScrollView那些事
前言 UIScrollView可以说是我们在日常编程中使用频率最多.扩展性最好的一个类,根据不同的需求和设计,我们都能玩出花来,当然有一些需求是大部分应用通用的,今天就聊一下以下需求,在一个categ ...
- 一个类搞定UIScrollView那些事儿
前言 UIScrollView可以说是我们在日常编程中使用频率最多.扩展性最好的一个类,根据不同的需求和设计,我们都能玩出花来,当然有一些需求是大部分应用通用的,今天就聊一下以下需求,在一个categ ...
随机推荐
- 【SpringCloud原理】Ribbon核心组件以及运行原理万字源码剖析
大家好,本文我将继续来剖析SpringCloud中负载均衡组件Ribbon的源码.本来我是打算接着OpenFeign动态代理生成文章直接讲Feign是如何整合Ribbon的,但是文章写了一半发现,如果 ...
- Java_选择结构
if单选择结构 if(布拉尔表达式){ //如果布拉尔表达式为true将执行的语句 } if双选择结构 if(布拉尔表达式){ //如果布拉尔表达式的值为true }else{ //如果布拉尔表达式的 ...
- Docker容器编译安装Nginx
Docker容器编译安装Nginx,最简单的Nginx配置. 创建容器&进入容器 宿主机2080映射容器的80端口 [root@localhost ~]# docker run -i -d - ...
- Docker容器(centos)安装zabbix
zabbix是一个基于WEB界面提供分布式系统监视以及网络监视功能的企业级的开源解决方案.--百度百科 zabbix介绍 zabbix主要有zabbix-server及zabbix-agent组成,z ...
- CSS 技术
浏览本篇文章前可以先看之前的前端网页介绍和html常用标签以便更容易理解 本文目录: 目录 CSS 技术介绍 CSS 语法规则 CSS 和 HTML 的结合方式 第一种: 第二种 第三种 CSS 选择 ...
- 使用Group By子句的时候,一定要记住下面的一些规则
使用Group By子句的时候,一定要记住下面的一些规则:(1)不能Group By非标量基元类型的列,如不能Group By text,image或bit类型的列(2)Select指定的每一列都应该 ...
- 【Srping】事务的执行原理(一)
在使用事务的时候需要添加@EnableTransactionManagement注解来开启事务,那么就从@EnableTransactionManagement入手查看一下事务的执行原理. @Enab ...
- SAP Office Excel Intergration
*&---------------------------------------------------------------------* *& Report DEMOEXCEL ...
- 基于bat脚本的前端发布流程的优化
背景介绍 前面在基于bat脚本的前端发布流程设计与实现中,我已经介绍了设计与实现,这一篇主要是针对其的一个优化折腾(分两步走,第一步先搞出来,第二步再想着怎么去优化它),我主要做了以下几件事. &qu ...
- POI 给单元格添加批注
图中红框框是处理单元格内容和批注的地方. 参考:https://blog.csdn.net/qq_38974638/article/details/114837631 //SXSSFWorkbook ...