mybatis拦截器感数据加解密
一、什么是Mybatis Plugin
在mybatis官方文档中,对于Mybatis plugin的的介绍是这样的:
1 | MyBatis 允许你在已映射语句执行过程中的某一点进行拦截调用。默认情况下,MyBatis 允许使用插件来拦截的方法调用包括: |
简而言之,即在执行sql的整个周期中,我们可以任意切入到某一点对sql的参数、sql执行结果集、sql语句本身等进行切面处理。基于这个特性,我们便可以使用其对我们需要进行加密的数据进行切面统一加密处理了(分页插件 pageHelper 就是这样实现数据库分页查询的)。
二、实现基于注解的敏感信息加解密拦截器
2.1 实现思路
对于数据的加密与解密,应当存在两个拦截器对数据进行拦截操作
参照官方文档,因此此处我们应当使用ParameterHandler拦截器对入参进行加密
使用ResultSetHandler拦截器对出参进行解密操作。
mybatis的interceptor接口有以下方法需要实现。
1 | public interface Interceptor { |
2.2 定义需要加密解密的敏感信息注解
定义注解敏感信息类的注解
1 | import java.lang.annotation.*; |
定义注解敏感信息类中敏感字段的注解
1 | import java.lang.annotation.*; |
2.3 定义加密接口及其实现类
定义加密接口,方便以后拓展加密方法(如AES加密算法拓展支持PBE算法,只需要注入时指定一下便可)
1 | import java.lang.reflect.Field; |
EncryptUtil 的AES加密实现类
1 | import cn.hutool.crypto.symmetric.SymmetricAlgorithm; |
2.4 实现入参加密拦截器
Myabtis包中的org.apache.ibatis.plugin.Interceptor拦截器接口要求我们实现以下三个方法
1 | public interface Interceptor { |
因此,参考官方文档的示例,我们自定义一个入参加密拦截器。
1 | @Intercepts 注解开启拦截器,@Signature 注解定义拦截器的实际类型。 |
1 | import com.example.demospringboot.mybaits.annotation.SensitiveData; |
自定义加密拦截加密完成
2.5 定义解密接口及其实现类
1 | /** |
1 | import cn.hutool.crypto.symmetric.SymmetricAlgorithm; |
2.6 定义出参解密拦截器
1 | import com.example.demospringboot.mybaits.annotation.SensitiveData; |
实体类加上注解,以下只做测试
1 | /** |
单元测试
1 | import com.example.demospringboot.user.SySUserService; |
可以看到 插入的数据自动加密
控制台
1 | test01 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 树灼的博客!


