基于springboot2 mysql Mybatis拦截器 实现 数据库脱敏

在 Spring Boot 2 中使用 MySQL 和 MyBatis 实现数据库脱敏,你可以考虑借助 MyBatis 的拦截器机制来实现。下面是一个简单的示例,演示如何在查询数据时进行脱敏处理。

假设有一个实体类 User,其中包含需要脱敏的字段,比如 nameemail

public class User {
    private Long id;
    private String name;
    private String email;

    // 省略构造函数、getter 和 setter
}

接下来,创建一个 MyBatis 的拦截器类,实现 Interceptor 接口。在拦截器中,你可以检查 SQL 语句,并对查询结果进行脱敏处理:

import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;

import java.sql.Statement;
import java.util.Properties;

@Intercepts({
    @Signature(
        type = Executor.class,
        method = "query",
        args = {MappedStatement.class, Object.class, Statement.class}
    )
})
public class DesensitizationInterceptor implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        Object[] args = invocation.getArgs();
        MappedStatement mappedStatement = (MappedStatement) args[0];
        Object parameter = args[1];

        // 判断是否是查询操作
        if (mappedStatement.getSqlCommandType().name().startsWith("SELECT")) {
            // 进行脱敏处理
            if (parameter instanceof User) {
                User user = (User) parameter;
                user.setName(desensitize(user.getName()));
                user.setEmail(desensitizeEmail(user.getEmail()));
            }
        }

        return invocation.proceed();
    }

    private String desensitize(String input) {
        // 实现你的脱敏逻辑,这里简单地用 "*" 替换字符
        return "****";
    }

    private String desensitizeEmail(String email) {
        // 对邮箱进行特定的脱敏逻辑,例如保留邮箱前缀,替换中间字符
        int atIndex = email.indexOf('@');
        if (atIndex > 0) {
            String prefix = email.substring(0, atIndex);
            return prefix.substring(0, Math.min(3, prefix.length())) + "****" + email.substring(atIndex);
        }
        return desensitize(email);
    }

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

    @Override
    public void setProperties(Properties properties) {
        // 可以在这里获取配置信息
    }
}

在拦截器中,我们使用 @Intercepts 注解标注拦截的方法,这里选择了 Executor.query 方法,表示拦截查询操作。在 intercept 方法中,我们对查询参数进行判断,如果是 User 类型,则对需要脱敏的字段进行处理。

最后,在 application.propertiesapplication.yml 中配置 MyBatis 的拦截器:

mybatis:
  configuration:
    # 设置拦截器
    interceptor:
      - com.example.DesensitizationInterceptor

这是一个简单的示例,实际应用中你可能需要根据具体需求实现更复杂的脱敏逻辑。在真实的系统中,请谨慎处理敏感数据,并确保符合相关法规和安全标准。


Mybatis拦截器 主要场景,请基于springboot2 mysql Mybatis拦截器 给出一个场景的代码示例

MyBatis 拦截器主要用于在执行 SQL 语句前后,以及在执行器方法前后进行拦截和增强。一个常见的使用场景是记录 SQL 执行时间。下面是一个基于 Spring Boot 2、MySQL 和 MyBatis 拦截器的场景代码示例,演示如何实现一个简单的 SQL 执行时间记录拦截器:

  1. 创建一个 SqlInterceptor 拦截器类:
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.plugin.*;

import java.util.Properties;

@Intercepts({
    @Signature(
        type = Executor.class,
        method = "update",
        args = {MappedStatement.class, Object.class}
    ),
    @Signature(
        type = Executor.class,
        method = "query",
        args = {MappedStatement.class, Object.class}
    )
})
public class SqlInterceptor implements Interceptor {

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        long startTime = System.currentTimeMillis();

        try {
            return invocation.proceed();
        } finally {
            long endTime = System.currentTimeMillis();
            long elapsedTime = endTime - startTime;

            // 获取执行的 SQL 语句信息
            MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];
            String sqlId = mappedStatement.getId();
            String sqlCommandType = mappedStatement.getSqlCommandType().toString();

            System.out.println(String.format("SQL ID: %s, Type: %s, Time: %d ms", sqlId, sqlCommandType, elapsedTime));
        }
    }

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

    @Override
    public void setProperties(Properties properties) {
        // 在这里可以获取配置信息
    }
}
  1. 在 Spring Boot 项目的配置文件中注册该拦截器:
mybatis:
  configuration:
    # 设置拦截器
    interceptor:
      - com.example.SqlInterceptor

这个拦截器会在执行 SQL 语句前后记录 SQL ID、类型以及执行时间。在实际应用中,你可能需要根据具体场景定制拦截器,比如实现缓存优化、权限控制、参数脱敏等。

请注意,MyBatis 拦截器在应用中的使用场景非常灵活,可以根据具体需求进行定制,以满足不同的业务需求。

你可能感兴趣的:(数据库,mysql,mybatis)