diff --git a/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/ProjectTenantInterceptor.java b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/ProjectTenantInterceptor.java index e75b5eded..e67c33b84 100644 --- a/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/ProjectTenantInterceptor.java +++ b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/ProjectTenantInterceptor.java @@ -4,6 +4,7 @@ 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 cn.stylefeng.roses.kernel.db.mp.tenant.holder.TenantIdHolder; import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; import net.sf.jsqlparser.expression.Expression; import net.sf.jsqlparser.expression.LongValue; @@ -30,6 +31,14 @@ public class ProjectTenantInterceptor implements TenantLineHandler { @Override public Expression getTenantId() { + + // 1. 优先从线程变量中获取,这个优先级最高 + Long tenantId = TenantIdHolder.get(); + if (ObjectUtil.isNotEmpty(tenantId)) { + return new LongValue(tenantId); + } + + // 2. 从LoginUser中获取tenantId LoginUser loginUserNullable = LoginContext.me().getLoginUserNullable(); if (loginUserNullable == null) { return null; diff --git a/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/holder/TenantIdHolder.java b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/holder/TenantIdHolder.java new file mode 100644 index 000000000..2b63de941 --- /dev/null +++ b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/holder/TenantIdHolder.java @@ -0,0 +1,43 @@ +package cn.stylefeng.roses.kernel.db.mp.tenant.holder; + +/** + * 租户id临时存放holder,这个优先级高于LoginUser获取的配置 + * + * @author fengshuonan + * @since 2023/8/31 17:03 + */ +public class TenantIdHolder { + + private static final ThreadLocal TENANT_ID_TEMP_HOLDER = new ThreadLocal<>(); + + /** + * 设置租户id + * + * @author fengshuonan + * @since 2023/8/31 17:04 + */ + public static void set(Long tenantId) { + TENANT_ID_TEMP_HOLDER.set(tenantId); + } + + /** + * 获取租户id + * + * @author fengshuonan + * @since 2023/8/31 17:04 + */ + public static Long get() { + return TENANT_ID_TEMP_HOLDER.get(); + } + + /** + * 删除租户id + * + * @author fengshuonan + * @since 2023/8/31 17:05 + */ + public static void remove() { + TENANT_ID_TEMP_HOLDER.remove(); + } + +} diff --git a/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/holder/TenantRemoveThreadLocalHolder.java b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/holder/TenantRemoveThreadLocalHolder.java new file mode 100644 index 000000000..0d63dd5df --- /dev/null +++ b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/holder/TenantRemoveThreadLocalHolder.java @@ -0,0 +1,20 @@ +package cn.stylefeng.roses.kernel.db.mp.tenant.holder; + +import cn.stylefeng.roses.kernel.rule.threadlocal.RemoveThreadLocalApi; +import org.springframework.stereotype.Component; + +/** + * 清除参数缓存相关的ThreadLocal + * + * @author fengshuonan + * @since 2023/8/31 17:06 + */ +@Component +public class TenantRemoveThreadLocalHolder implements RemoveThreadLocalApi { + + @Override + public void removeThreadLocalAction() { + TenantIdHolder.remove(); + } + +} diff --git a/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/sys/starter/init/InitAdminService.java b/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/sys/starter/init/InitAdminService.java index 08f196063..f709c3b90 100644 --- a/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/sys/starter/init/InitAdminService.java +++ b/kernel-s-system/system-spring-boot-starter/src/main/java/cn/stylefeng/roses/kernel/sys/starter/init/InitAdminService.java @@ -24,6 +24,7 @@ */ package cn.stylefeng.roses.kernel.sys.starter.init; +import cn.stylefeng.roses.kernel.db.mp.tenant.holder.TenantIdHolder; import cn.stylefeng.roses.kernel.sys.api.constants.SysConstants; import cn.stylefeng.roses.kernel.sys.api.expander.TenantConfigExpander; import cn.stylefeng.roses.kernel.sys.modular.menu.entity.SysMenu; @@ -77,10 +78,15 @@ public class InitAdminService { // 找到默认系统租户下,后台管理员角色id LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SysRole::getRoleCode, SysConstants.BACKEND_ADMIN_ROLE_CODE); - // 默认根租户 - queryWrapper.eq(SysRole::getTenantId, TenantConfigExpander.getDefaultRootTenantId()); - queryWrapper.select(SysRole::getRoleId); - SysRole superAdminRole = sysRoleService.getOne(queryWrapper); + SysRole superAdminRole; + try { + // 设置一个默认根租户 + TenantIdHolder.set(TenantConfigExpander.getDefaultRootTenantId()); + queryWrapper.select(SysRole::getRoleId); + superAdminRole = sysRoleService.getOne(queryWrapper); + } finally { + TenantIdHolder.remove(); + } // 获取所有的菜单和功能 List totalMenuList = sysMenuService.getTotalMenuList();