多租户是什么:
多租户:多租户技术又称多重租赁技术,是一种软件即服务的软件服务架构(简称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多租户插件配置:
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) {
//这是我的一个上下文类,忽略当前线程使用租户数据隔离