自定义一个MyBaits脱敏插件

自定义一个MyBaits脱敏插件

用于对查询结果中的敏感数据进行脱敏处理。这个插件将拦截ResultSetHandler对象的处理结果,对某些敏感字段进行脱敏。

插件实现步骤

  1. 创建脱敏插件类
  2. 注册插件

1. 创建脱敏插件类

首先,我们创建一个自定义插件类 DataMaskingInterceptor,它会拦截查询结果并对特定字段进行脱敏处理。

import org.apache.ibatis.executor.resultset.ResultSetHandler;
import org.apache.ibatis.plugin.*;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Properties;

@Intercepts({
    @Signature(type = ResultSetHandler.class, method = "handleResultSets", args = {Statement.class})
})
public class DataMaskingInterceptor implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 执行查询操作
        Object result = invocation.proceed();

        if (result instanceof List) {
            List<?> resultList = (List<?>) result;
            for (Object obj : resultList) {
                if (obj instanceof Map) {
                    Map<String, Object> map = (Map<String, Object>) obj;
                    maskSensitiveData(map);
                } else {
                    // 使用反射对对象进行脱敏处理
                    maskSensitiveData(obj);
                }
            }
        }

        return result;
    }

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

    @Override
    public void setProperties(Properties properties) {
        // 可以读取配置属性
    }

    // 脱敏方法
    private void maskSensitiveData(Map<String, Object> map) {
        for (String key : map.keySet()) {
            if (key.equalsIgnoreCase("phoneNumber")) {
                map.put(key, maskPhoneNumber((String) map.get(key)));
            } else if (key.equalsIgnoreCase("email")) {
                map.put(key, maskEmail((String) map.get(key)));
            }
        }
    }

    private void maskSensitiveData(Object obj) {
        // 使用反射对对象的敏感字段进行脱敏处理
        Field[] fields = obj.getClass().getDeclaredFields();
        for (Field field : fields) {
            field.setAccessible(true);
            try {
                if (field.getName().equalsIgnoreCase("phoneNumber")) {
                    field.set(obj, maskPhoneNumber((String) field.get(obj)));
                } else if (field.getName().equalsIgnoreCase("email")) {
                    field.set(obj, maskEmail((String) field.get(obj)));
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }

    private String maskPhoneNumber(String phoneNumber) {
        if (phoneNumber != null && phoneNumber.length() >= 7) {
            return phoneNumber.substring(0, 3) + "****" + phoneNumber.substring(7);
        }
        return phoneNumber;
    }

    private String maskEmail(String email) {
        if (email != null && email.contains("@")) {
            int atIndex = email.indexOf("@");
            return email.substring(0, 2) + "****" + email.substring(atIndex);
        }
        return email;
    }
}

2. 注册插件

将插件注册到MyBatis的配置中。在Spring Boot项目中,可以在配置类中进行注册:

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyBatisConfig {

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);

        // 注册自定义插件
        sqlSessionFactoryBean.setPlugins(new Interceptor[]{new DataMaskingInterceptor()});

        return sqlSessionFactoryBean.getObject();
    }
}

结果测试

假设有一个User类:

public class User {
    private String phoneNumber;
    private String email;
    // 其他字段及getter/setter
}

以及对应的Mapper:

import com.baomidou.mybatisplus.core.mapper.BaseMapper;

public interface UserMapper extends BaseMapper<User> {
}

当我们执行查询操作时,结果中的phoneNumberemail字段将会被脱敏处理:

@Autowired
private UserMapper userMapper;

public List<User> getUsers() {
    return userMapper.selectList(null);
}

查询结果中的phoneNumberemail字段将会被插件自动脱敏,如下所示:

  • phoneNumber123****7890
  • emailex****@example.com

通过这种方式,我们可以利用MyBatis的插件机制轻松实现数据脱敏功能。

在这里插入图片描述

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑风风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值