【8.0】【tenant】【db】更新租户拦截器

pull/57/head
fengshuonan 2023-08-30 10:50:01 +08:00
parent 1dd597025a
commit 84c5540be2
4 changed files with 154 additions and 2 deletions

View File

@ -0,0 +1,45 @@
/*
* Copyright [2020-2030] [https://www.stylefeng.cn]
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* GunsAPACHE LICENSE 2.0使
*
* 1.LICENSE
* 2.Guns
* 3.
* 4. https://gitee.com/stylefeng/guns
* 5. https://gitee.com/stylefeng/guns
* 6.
*/
package cn.stylefeng.roses.kernel.db.api.pojo.tenant;
import lombok.Data;
import java.util.List;
/**
*
*
* @author fengshuonan
* @since 2023/8/30 10:37
*/
@Data
public class TenantTableProperties {
/**
*
*/
private List<String> businessTableList;
}

View File

@ -0,0 +1,69 @@
package cn.stylefeng.roses.kernel.db.mp.tenant;
import cn.hutool.core.util.ObjectUtil;
import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
import cn.stylefeng.roses.kernel.db.api.pojo.tenant.TenantTableProperties;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.schema.Column;
import java.util.List;
/**
*
*
* @author fengshuonan
* @since 2023/8/30 10:14
*/
public class ProjectTenantInterceptor implements TenantLineHandler {
/**
*
*/
private TenantTableProperties tenantTableProperties;
public ProjectTenantInterceptor(TenantTableProperties tenantTableProperties) {
this.tenantTableProperties = tenantTableProperties;
}
@Override
public Expression getTenantId() {
LoginUser loginUserNullable = LoginContext.me().getLoginUserNullable();
if (loginUserNullable == null) {
return null;
}
if (ObjectUtil.isEmpty(loginUserNullable.getTenantId())) {
return null;
}
return new LongValue(loginUserNullable.getTenantId());
}
@Override
public boolean ignoreTable(String tableName) {
if (tenantTableProperties == null) {
return true;
}
List<String> businessTableList = tenantTableProperties.getBusinessTableList();
if (ObjectUtil.isEmpty(businessTableList)) {
return true;
}
for (String tenantTable : businessTableList) {
if (tenantTable.equalsIgnoreCase(tableName)) {
return false;
}
}
return true;
}
@Override
public boolean ignoreInsert(List<Column> columns, String tenantIdColumn) {
return TenantLineHandler.super.ignoreInsert(columns, tenantIdColumn);
}
}

View File

@ -31,6 +31,12 @@
<version>${roses.version}</version> <version>${roses.version}</version>
</dependency> </dependency>
<!--properties自动提示装载-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

View File

@ -24,15 +24,20 @@
*/ */
package cn.stylefeng.roses.kernel.db.starter; package cn.stylefeng.roses.kernel.db.starter;
import cn.stylefeng.roses.kernel.db.api.pojo.tenant.TenantTableProperties;
import cn.stylefeng.roses.kernel.db.mp.dbid.CustomDatabaseIdProvider; import cn.stylefeng.roses.kernel.db.mp.dbid.CustomDatabaseIdProvider;
import cn.stylefeng.roses.kernel.db.mp.fieldfill.CustomMetaObjectHandler; import cn.stylefeng.roses.kernel.db.mp.fieldfill.CustomMetaObjectHandler;
import cn.stylefeng.roses.kernel.db.mp.injector.CustomInsertBatchSqlInjector; import cn.stylefeng.roses.kernel.db.mp.injector.CustomInsertBatchSqlInjector;
import cn.stylefeng.roses.kernel.db.mp.tenant.ProjectTenantInterceptor;
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
import org.springframework.boot.autoconfigure.AutoConfigureBefore; import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
@ -46,6 +51,19 @@ import org.springframework.context.annotation.Configuration;
@AutoConfigureBefore(MybatisPlusAutoConfiguration.class) @AutoConfigureBefore(MybatisPlusAutoConfiguration.class)
public class ProjectMyBatisPlusAutoConfiguration { public class ProjectMyBatisPlusAutoConfiguration {
/**
* yml tenant.businessTableList
*
* @author fengshuonan
* @since 2023/8/30 10:39
*/
@Bean
@ConfigurationProperties(prefix = "tenant")
@ConditionalOnMissingBean(TenantTableProperties.class)
public TenantTableProperties tenantTableProperties() {
return new TenantTableProperties();
}
/** /**
* *
* *
@ -53,9 +71,12 @@ public class ProjectMyBatisPlusAutoConfiguration {
* @since 2020/12/24 13:13 * @since 2020/12/24 13:13
*/ */
@Bean @Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() { public MybatisPlusInterceptor mybatisPlusInterceptor(TenantTableProperties tenantTableProperties) {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 使用多租户插件
interceptor.addInnerInterceptor(tenantLineInnerInterceptor(tenantTableProperties));
// 使用分页插插件 // 使用分页插插件
interceptor.addInnerInterceptor(paginationInterceptor()); interceptor.addInnerInterceptor(paginationInterceptor());
@ -110,7 +131,7 @@ public class ProjectMyBatisPlusAutoConfiguration {
} }
/** /**
* sqlInjector * sqlInjector
* *
* @author fengshuonan * @author fengshuonan
* @since 2022/9/17 14:28 * @since 2022/9/17 14:28
@ -120,4 +141,15 @@ public class ProjectMyBatisPlusAutoConfiguration {
return new CustomInsertBatchSqlInjector(); return new CustomInsertBatchSqlInjector();
} }
/**
*
*
* @author fengshuonan
* @since 2023/8/30 10:17
*/
@Bean
public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantTableProperties tenantTableProperties) {
return new TenantLineInnerInterceptor(new ProjectTenantInterceptor(tenantTableProperties));
}
} }