From c3a7a0fa0e8872f98868485010fa90987321168d Mon Sep 17 00:00:00 2001 From: fengshuonan Date: Thu, 31 Aug 2023 17:20:17 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=908.0=E3=80=91=E3=80=90tenant=E3=80=91?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=8E=B7=E5=8F=96=E7=A7=9F=E6=88=B7id?= =?UTF-8?q?=E7=AD=96=E7=95=A5=EF=BC=8C=E5=A2=9E=E5=8A=A0=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E5=8F=98=E9=87=8F=E8=8E=B7=E5=8F=96=E6=96=B9?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mp/tenant/ProjectTenantInterceptor.java | 9 ++++ .../db/mp/tenant/holder/TenantIdHolder.java | 43 +++++++++++++++++++ .../holder/TenantRemoveThreadLocalHolder.java | 20 +++++++++ .../sys/starter/init/InitAdminService.java | 14 ++++-- 4 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/holder/TenantIdHolder.java create mode 100644 kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/tenant/holder/TenantRemoveThreadLocalHolder.java 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();