【分享】Mybatis-plus多租户插件实现数据隔离方案分享

多租户是什么:

多租户:多租户技术又称多重租赁技术,是一种软件即服务的软件服务架构(简称SaaS)。同一个系统开放给多个组织/用户使用,每个组织/用户需要进行数据隔离,并且每个组织/用户可以自定义自己租用系统的个性化配置。使用多重租赁技术还有PaaS,IaaS等。


Mybatis-plus多租户插件实现原理:

注意:多租户 != 权限过滤,不要乱用,租户之间是完全隔离的!!!启用多租户后所有执行的method的sql都会进行处理.

自写的sql请按规范书写(sql涉及到多个表的每个表都要给别名,特别是 inner join 的要写标准的 inner join)

TenantLineInnerInterceptor 租户数据隔离内置拦截器(插件)

属性名 类型 描述
tenantLineHandler TenantLineHandler 租户处理器( TenantId 行级 )
public interface TenantLineHandler {
   

    /**
     * 获取租户 ID 值表达式,只支持单个 ID 值
     * <p>
     *
     * @return 租户 ID 值表达式
     */
    Expression getTenantId();

    /**
     * 获取租户字段名
     * <p>
     * 默认字段名叫: tenant_id
     *
     * @return 租户字段名
     */
    default String getTenantIdColumn() {
   
        return "tenant_id";
    }

    /**
     * 根据表名判断是否忽略拼接多租户条件
     * <p>
     * 默认都要进行解析并拼接多租户条件
     *
     * @param tableName 表名
     * @return 是否忽略, true:表示忽略,false:需要解析并拼接多租户条件
     */
    default boolean ignoreTable(String tableName) {
   
        return false;
    }
}

Mybatis-plus多租户插件配置:

mybatis-plus多租户插件官方文档

yml可配置具体的表不走多租户数据隔离(可设计成starter给其他服务使用)

ignore-tenant-tables: user_info,user1

MybatisConfig配置类

@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
public class MybatisConfig {
   
	//忽略租户过滤表集合
    @Value("${ignore-tenant-tables:}")
    private String ignoreTenantTables;

    // 最新版
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
   
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        if (!StringUtils.isBlank(ignoreTenantTables)) {
   
            List<String> ignoreTenantTableList = Arrays.asList(StringUtils.split(ignoreTenantTables, ","));
            if (!CollectionUtils.isEmpty(ignoreTenantTableList)) {
   
                //多租户插件
                interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
   
                    @Override
                    public Expression getTenantId() {
   
		                return new LongValue(1);
                    }

                    @Override
                    public boolean ignoreTable(String tableName) {
   
                    	//这是我的一个上下文类,忽略当前线程使用租户数据隔离
           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码农阿福

看明白的同学,别忘请阿福喝奶茶

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

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

打赏作者

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

抵扣说明:

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

余额充值