基于Mybatis-Plus的多租户&数据权限隔离(全网最优)
在使用MyBatis-Plus实现多租户数据权限隔离时,可以通过自定义拦截器来实现。以下是一个简化的示例代码:
import com.baomidou.mybatisplus.core.parser.ISqlParser;
import com.baomidou.mybatisplus.extension.handlers.AbstractSqlParserHandler;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.StringValue;
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加多租户拦截器
interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
@Override
public Expression getTenantId() {
// 获取当前租户ID
String tenantId = "your_tenant_id";
return new StringValue(tenantId);
}
@Override
public String getTenantIdColumn() {
// 租户ID字段名
return "tenant_id";
}
@Override
public boolean ignoreTable(String tableName) {
// 忽略不需要租户隔离的表
return "user".equals(tableName); // 假设user表不需要租户隔离
}
}));
// 分页插件
interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
return interceptor;
}
}
在这个配置类中,我们定义了一个MybatisPlusInterceptor
,并添加了TenantLineInnerInterceptor
以及PaginationInnerInterceptor
。TenantLineInnerInterceptor
使用了自定义的TenantLineHandler
来提供租户ID以及相关配置。在执行数据库操作时,MyBatis-Plus会根据配置自动注入租户ID,从而实现多租户数据权限隔离。
注意:这只是一个简化的示例,实际应用中你需要根据自己的需求来实现getTenantId
和ignoreTable
方法。同时,getTenantIdColumn
方法中的字段名需要和数据库中实际存储租户ID的列名一致。
评论已关闭