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来接收的。
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来接收的。