【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>
</dependency>
<!--properties自动提示装载-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -24,15 +24,20 @@
*/
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.fieldfill.CustomMetaObjectHandler;
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.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
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.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@ -46,6 +51,19 @@ import org.springframework.context.annotation.Configuration;
@AutoConfigureBefore(MybatisPlusAutoConfiguration.class)
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
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
public MybatisPlusInterceptor mybatisPlusInterceptor(TenantTableProperties tenantTableProperties) {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 使用多租户插件
interceptor.addInnerInterceptor(tenantLineInnerInterceptor(tenantTableProperties));
// 使用分页插插件
interceptor.addInnerInterceptor(paginationInterceptor());
@ -110,7 +131,7 @@ public class ProjectMyBatisPlusAutoConfiguration {
}
/**
* sqlInjector
* sqlInjector
*
* @author fengshuonan
* @since 2022/9/17 14:28
@ -120,4 +141,15 @@ public class ProjectMyBatisPlusAutoConfiguration {
return new CustomInsertBatchSqlInjector();
}
/**
*
*
* @author fengshuonan
* @since 2023/8/30 10:17
*/
@Bean
public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantTableProperties tenantTableProperties) {
return new TenantLineInnerInterceptor(new ProjectTenantInterceptor(tenantTableProperties));
}
}