SpringBoot-开发技巧-加密返回字段

思君令人老,岁月忽已晚。

1 前言

前文中已经讲解了使用 RSA 加密返回数据报文的分享,但是在某些情况下,需要加密的不是整个报文,而是报文中的某些字段,比如涉及到个人信息,身份证、姓名和手机号等信息,这些是需要进行加密返回,在经过授权或者认证之后才能经过解密展示全文。此外,在显示金额字段时,还可能对数据进行脱敏处理,这些都需要用到今天分析的内容,如何加密或者脱敏返回某些特定的字段。

2 实现分析

首先我们需要先明晰一下具体的需求,如下图所示,对个人信息比如姓名、邮箱、手机号、身份证等信息进行脱敏,只展示一部分的信息。

那么怎么能实现这个脱敏或者加密呢,写一个工具类,对每个返回的数据内容遍历并处理需要脱敏或者加密的字段呢,显然这个工作量很大,而且容易遗漏,如果变动其脱敏方法也很困难,这个需求和业务耦合度很高,所以这种方式非常的不推荐。

这里推荐的是一个 AOP 的做法,实现业务和脱敏需求的剥离, AOP 大家都很熟悉,面向切面编程,其实处理脱敏或者加密也是在方法返回之前进行处理,这个做法的非常推荐的,但是我们要怎么处理具体的脱敏字段呢,这就用到了 java 中的注解,通常我们使用注解是在方法上,诸如实现业务日志的记录,我们可以自定义注解,加在需要脱敏或者加密的返回类的属性上,这样在切面中拦截注解,根据其特征来处理脱敏或者加密。

3 代码分析

如上所述,我们需要定义一个注解,用于标记需要脱敏或者加密的属性,如下所示:

那么如何能够拦截到方法的返回值呢,这里需要用到 HandlerMethodReturnValueHandler,这是spring 中的一个 Handler, 可以捕获控制器层方法的返回值,具体做法如下图所示:

由于返回值的类型不统一,需要考虑各种可能性,最终通过判断来获取返回实体类,针对具体的返回实体进行处理。

获取到具体的实体类后,需要获取实体的每个字段,通过判断是否含有脱敏注解来进一步处理。默认情况下,需要按照脱敏来处理,根据试题配置的脱敏规则来处理字段值的脱敏。如果需要加密,则使用 DES 的对称加密来实现。

完成以上的配置后,还需要将该配置放入 spring 上下文中,如下图所示:

4 结果展示

完成以上的配置后,即可实现加密或者脱敏的功能,如下图所示:

使用注解的方式,可以很好的完成需求,同时也很方便调整脱敏的策略和加密方式,实现了业务和脱敏或者加密的分离,避免了重复的代码。

5 总结

在本文中,介绍了使用注解的方式完成返回值部分字段的加密和脱敏,这个技能点在日常的业务开发中会经常使用,尤其是在涉及个人信息的场景。还有一种方式是在通过 orm 框架读取数据时进行处理,但是此种方式可能会阻碍正常业务的开展,脱敏的数据可能无法正常判断,所以还是推荐在返回结果数据时进行脱敏或者加密处理。本文中所涉及的代码已经上传至 github, 欢迎交流学习。项目地址 springboot-templet-start

相关推荐
野犬寒鸦10 分钟前
从零起步学习MySQL || 第七章:初识索引底层运用及性能优化(结合底层数据结构讲解)
java·数据库·后端·mysql·oracle
全职计算机毕业设计22 分钟前
基于SpringBoot框架的在线教育系统设计与实现(三套文档参考)
java·spring boot·后端
No8g攻城狮30 分钟前
【异常解决】使用DateUtil.isSameDay()方法判断秒级时间戳是否属于同一天踩过的坑
java·jvm·spring boot·java-ee·springboot
IT_陈寒32 分钟前
Python性能优化:5个被低估但效果惊人的内置函数实战解析
前端·人工智能·后端
千码君20161 小时前
Go语言:对其语法的一些见解
开发语言·后端·golang
yuuki2332331 小时前
【C语言】预处理详解
c语言·windows·后端
合作小小程序员小小店1 小时前
web网页开发,在线%考试,教资,题库%系统demo,基于vue,html,css,python,flask,随机分配,多角色,前后端分离,mysql数据库
前端·vue.js·后端·前端框架·flask
顾漂亮1 小时前
Redis深度探索
java·redis·后端·spring·缓存
努力也学不会java1 小时前
【Spring】Spring事务和事务传播机制
java·开发语言·人工智能·spring boot·后端·spring