mybatis基于注解和拦截器实现敏感信息加密和解密

项目:spingboot
jdk:1.8

需求背景:
为避免用户信息泄露,用户的敏感信息(证件号码、手机号)等在存储前需要加密后再存储,在查询的时候需要先解密才能在前端展示

1.1 实现思路

对于数据的加密与解密,应当存在两个拦截器对数据进行拦截操作
参照官方文档,因此此处我们应当使用ParameterHandler拦截器对入参进行加密
使用ResultSetHandler拦截器对出参进行解密操作。
在这里插入图片描述

1.2 定义需要加密解密的敏感信息注解

定义注解敏感信息类(如实体类POJO\PO)的注解

/**
 * 注解敏感信息类的注解
 */
@Inherited
@Target({
    ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface SensitiveData {
   
    
}

定义注解敏感信息类中敏感字段的注解

/**
 * 注解敏感信息类中敏感字段的注解
 */
@Inherited
@Target({
    ElementType.FIELD })
@Retention(RetentionPolicy.RUNTIME)
public @interface SensitiveField {
   
    
}

1.3 定义加密拦截器,入库前先对字段加密

@Intercepts 注解开启拦截器,@Signature 注解定义拦截器的实际类型。
@Signature中
type 属性指定当前拦截器使用StatementHandler 、ResultSetHandler、ParameterHandler,
Executor的一种
method 属性指定使用以上四种类型的具体方法(可进入class内部查看其方法)。
args 属性指定预编译语句
此处我们使用了 ParameterHandler.setParamters()方法,拦截mapper.xml中paramsType的实例
(即在每个含有paramsType属性mapper语句中,都执行该拦截器,对paramsType的实例进行拦截处
理)

@Component
@Slf4j
// 定义拦截器,拦截参数处理类ParameterHandler的setParameters方法
@Intercepts({
   @Signature(type = ParameterHandler.class,method = "setParameters",
        args = PreparedStatement.class)})
public class EncryptInterceptor implements Interceptor {
   

    @Autowired
    EncryptUtil encryptUtil;

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
   
        //@Signature 指定了 type= parameterHandler 后,这里的 invocation.getTarget() 便是parameterHandler
        //若指定ResultSetHandler ,这里则能强转为ResultSetHandler
        ParameterHandler parameterHandler = (ParameterHandler)invocation.getTarget();
        // 获取参数对像,即 mapper 中 paramsType 的实例
        Field paramFiled = parameterHandler.getClass().getDeclaredField("parameterObject")
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值