mirror of https://gitee.com/stylefeng/roses
【8.0】【tenant】更新获取租户id策略,增加一个线程变量获取方式
parent
4fd0a89dc5
commit
c3a7a0fa0e
|
@ -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;
|
||||
|
|
|
@ -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<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();
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue