前言

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

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

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

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

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

技术版本

实现过程

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接口定制属性加解密的更多相关文章

  1. Spring Security基于Oauth2的SSO单点登录怎样做?一个注解搞定

    一.说明 单点登录顾名思义就是在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统,免除多次登录的烦恼.本文主要介绍 同域 和 跨域 两种不同场景单点登录的实现原理,并使用 Spring ...

  2. 搞定SpringBoot多数据源(1):多套源策略

    目录 1. 引言 2. 运行环境 3. 多套数据源 3.1 搭建 Spring Boot 工程 3.1.1 初始化 Spring Boot 工程 3.1.2 添加 MyBatis Plus 依赖 3. ...

  3. 搞定SpringBoot多数据源(2):动态数据源

    目录 1. 引言 2. 动态数据源流程说明 3. 实现动态数据源 3.1 说明及数据源配置 3.1.1 包结构说明 3.1.2 数据库连接信息配置 3.1.3 数据源配置 3.2 动态数据源设置 3. ...

  4. 搞定SpringBoot多数据源(3):参数化变更源

    目录 1. 引言 2. 参数化变更源说明 2.1 解决思路 2.2 流程说明 3. 实现参数化变更源 3.1 改造动态数据源 3.1.1 动态数据源添加功能 3.1.2 动态数据源配置 3.2 添加数 ...

  5. 将你的前端应用打包成docker镜像并部署到服务器?仅需一个脚本搞定

    1.前言 前段时间,自己搞了个阿里云的服务器.想自己在上面折腾,但是不想因为自己瞎折腾而污染了现有的环境.毕竟,现在的阿里云已经没有免费的快照服务了.要想还原的话,最简单的办法就是重新装系统.而一旦重 ...

  6. Jquery一个slideToggle搞定div的隐藏与显示

    Jquery一个slideToggle搞定div的隐藏与显示 <!DOCTYPE html> <html> <head> <script src=" ...

  7. SpringBoot中如何灵活的实现接口数据的加解密功能?

    数据是企业的第四张名片,企业级开发中少不了数据的加密传输,所以本文介绍下SpringBoot中接口数据加密.解密的方式. 本文目录 一.加密方案介绍二.实现原理三.实战四.测试五.踩到的坑 一.加密方 ...

  8. 一个类搞定UIScrollView那些事

    前言 UIScrollView可以说是我们在日常编程中使用频率最多.扩展性最好的一个类,根据不同的需求和设计,我们都能玩出花来,当然有一些需求是大部分应用通用的,今天就聊一下以下需求,在一个categ ...

  9. 一个类搞定UIScrollView那些事儿

    前言 UIScrollView可以说是我们在日常编程中使用频率最多.扩展性最好的一个类,根据不同的需求和设计,我们都能玩出花来,当然有一些需求是大部分应用通用的,今天就聊一下以下需求,在一个categ ...

随机推荐

  1. 06vim --- gcc库的制作及使用

    VIM 命令模式下的操作 保存退出 快捷键 操作 ZZ 保存退出 代码格式化 快捷键 操作 gg=G 代码的格式化 光标移动(键盘上下左右键课代替) 快捷键 操作 h 光标左移 j 光标下移 k 光标 ...

  2. Django对接支付宝Alipay支付接口

    最新博客更新见我的个人主页: https://xzajyjs.cn 我们在使用Django构建网站时常需要对接第三方支付平台的支付接口,这里就以支付宝为例(其他平台大同小异),使用支付宝开放平台的沙箱 ...

  3. 「洛谷 P3834」「模板」可持久化线段树 题解报告

    题目描述 给定n个整数构成的序列,将对于指定的闭区间查询其区间内的第k小值. 输入输出格式 输入格式 第一行包含两个正整数n,m,分别表示序列的长度和查询的个数. 第二行包含n个整数,表示这个序列各项 ...

  4. QT 基于QScrollArea的界面嵌套移动

    在实际的应用场景中,经常会出现软件界面战场图大于实际窗体大小,利用QScrollArea可以为widget窗体添加滚动条,可以实现小窗体利用滚动条显示大界面需求.实现如下: QT创建一个qWidget ...

  5. 基于web3D展示技术的煤矿巷道3D可视化系统

    地下开采离不开巷道工程.煤矿的生产.运输.排水.通风等各个环节都少不了巷道的支持.在煤矿智能化建设被提上日程的今天,巷道工程的智能化.可视化建设也成了行业趋势.尤其是复杂的井下作业环境,人员信息安全问 ...

  6. Vue3.0系列——「vue3.0学习手册」第一期

    一.项目搭建 vite是尤大大开发的一款意图取代webpack的工具.其实现原理是利用ES6的import发送请求加载文件的特性.拦截这些请求,做一些编译,省去webpack冗长的打包时间.并将其与R ...

  7. SAP Tree editor(树形结构)

    SAP List Tree 效果 源代码 *&---------------------------------------------------------------------* *& ...

  8. ABAP CDS DDHEADANNO

  9. CF484A Bits

    CF484A Bits 题目 https://codeforces.com/problemset/problem/484/A 题解 思路 知识点:贪心,位运算. 每位独立考虑,要使 \(1\) 的数量 ...

  10. 让你的Nginx支持分布式追踪

    Background NGINX 是一个通用且流行的应用程序.也是最流行的 Web 服务器,它可用于提供静态文件内容,但也通常与其他服务一起用作分布式系统中的组件,在其中它用作反向代理.负载均衡 或 ...