【8.0】【tenant】更新获取租户id策略,增加一个线程变量获取方式

pull/57/head
fengshuonan 2023-08-31 17:20:17 +08:00
parent 4fd0a89dc5
commit c3a7a0fa0e
4 changed files with 82 additions and 4 deletions

View File

@ -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;

View File

@ -0,0 +1,43 @@
package cn.stylefeng.roses.kernel.db.mp.tenant.holder;
/**
* idholderLoginUser
*
* @author fengshuonan
* @since 2023/8/31 17:03
*/
public class TenantIdHolder {
private static final ThreadLocal<Long> 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();
}
}

View File

@ -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();
}
}

View File

@ -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<SysRole> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SysRole::getRoleCode, SysConstants.BACKEND_ADMIN_ROLE_CODE);
// 默认根租户
queryWrapper.eq(SysRole::getTenantId, TenantConfigExpander.getDefaultRootTenantId());
SysRole superAdminRole;
try {
// 设置一个默认根租户
TenantIdHolder.set(TenantConfigExpander.getDefaultRootTenantId());
queryWrapper.select(SysRole::getRoleId);
SysRole superAdminRole = sysRoleService.getOne(queryWrapper);
superAdminRole = sysRoleService.getOne(queryWrapper);
} finally {
TenantIdHolder.remove();
}
// 获取所有的菜单和功能
List<SysMenu> totalMenuList = sysMenuService.getTotalMenuList();