前言

上个月公司另一个团队做的新项目上线后大体上运行稳定,但包括研发负责人在内的两个人在项目上线后立马就跳槽了,然后又交接给了我这个「垃圾回收人员」。

本周甲方另一个厂家的监控平台扫描到我们这个项目某些接口的一些敏感信息没有做加密,要求我们立马处理。

检查了一下发现还真是这样,手机、身份证号什么的都没脱敏,心里顿时一万头神兽在奔腾。

还好,我有长期应对这类突发事情的经验,直接写了一个自定义注解,然后在需要加解密的接口上加上,和前端一联调,欧克搞定,之后脸上保持沉重,但内心淡定摸鱼,好不潇洒。

趁着摸鱼的空闲,我把实现方法简化后用最易懂的方式分享出来,大家可以收藏一下,哪天用得上可以捞出来瞅瞅,节省点思考的时间。

技术版本

实现过程

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切面的实现中,针对请求对象的类型也留下了口子,感兴趣的小伙伴可以下载源码自行扩展,拿来练习都是不错的选择。

源码会在评论区中给出来哦~


原创文章纯手打,觉得有一滴滴帮助就请举手之劳点个推荐吧~

持续分享工作中的真实经验和心得体会,喜欢的话就点个关注吧~

最新文章

  1. c++的转换
  2. Dapper学习 - Dapper的基本用法(二) - 存储过程/函数
  3. 从零开始学Bootstrap(2)
  4. ASP.NET Web.Config 读写辅助类
  5. IOS中调整UI控件位置和尺寸
  6. 你好,C++(13)这道单选题的答案是A、B、C还是D?3.7 枚举类型
  7. 【LeetCode练习题】Reverse Linked List II
  8. 读书笔记:《梦断代码Dreaming in Code》
  9. MongoDB学习笔记-基础概念
  10. Node.js中读取文件后用Json.parse方法报错
  11. D3.js:力导向图
  12. 自己开发轻量级ORM(一)
  13. Spring Boot 快速入门笔记
  14. dig请求和回应中的参数解释
  15. 如何解决 快速点击多次触发的bug 期望快速点击只一次生效
  16. 一次线上问题引发的对于C#中相等判断的思考
  17. asp.net数据加载进度和模态窗口的完美打开,而且窗口不被阻止
  18. 如何将页面上的数据导入excel中
  19. Vue引入jQuery
  20. Python学习笔记第八周

热门文章

  1. shellcode编写
  2. SMFL 教程&个人笔记
  3. Vue基础篇之 插槽 slot
  4. 带你学习MindSpore中算子使用方法
  5. 关于『Markdown』:第一弹
  6. call apply bind的作用及区别? 应用场景?
  7. numpy学习笔记 01
  8. Python:27行代码实现将多个Excel表格内容批量汇总合并到一个表格
  9. Springboot 整合 MongoDB
  10. Linux操作系统(2):组管理和权限管理