Mybatis拦截结果集实现字段加密

业务背景

  • 在实际开发过程中,业务上会有很多数据交互和传输,其中必然存在一些敏感数据,不能直接明文传输,需要进行加密
  • 前端后端数据交互时
  • 上下游子系统之间交互时
  • 本文基于Mybatis结果集ResultSetHandler拦截实现字段加密

一、声明注解

  • 用于指定加密字段
@Documented
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Encryption {
}

二、加密工具类

public class EncryptionUtil {

    // 使用Base64进行加密
    public static String Base64Encode(String res) {
        return Base64.encode(res.getBytes());
    }

    // 使用Base64进行解密
    public static String Base64Decode(String res) {
        return new String(Base64.decode(res));
    }
}

三、开启加密

  • 配置文件
#开启数据加密
encryption=true
  • 实体类字段添加注解
@Data
public class User {

    @TableId(type = IdType.AUTO)
    private Long id;

    @Encryption
    private String name;

    private Integer age;
    
    @Encryption
    private String email;
}

四、拦截结果集

@ConditionalOnProperty(value = "encryption", havingValue = "true")
@Intercepts({
    @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})
})
@Component
public class ResultInterceptor implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Object result = invocation.proceed();
        if (Objects.isNull(result)) {
            return null;
        }
        //List
        if (result instanceof ArrayList) {
            ArrayList resultList = (ArrayList) result;
            for (Object obj : resultList) {
                encryptionObject(obj);
            }
        }
        //object
        else {
            encryptionObject(result);
        }
        return result;
    }

    //对象字段加密
    private void encryptionObject(Object obj) throws IllegalAccessException {
        Field[] fields = obj.getClass().getDeclaredFields();
        for (Field field : fields) {
            if (field.getAnnotation(Encryption.class) != null) {
                field.setAccessible(true);
                Object o = field.get(obj);
                if (o != null) {
                    String encode = EncryptionUtil.Base64Encode(o.toString());
                    field.set(obj, encode);
                }
            }
        }
    }

    @Override
    public Object plugin(Object o) {
        return Plugin.wrap(o, this);
    }

    @Override
    public void setProperties(Properties properties) {

    }
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值