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.context.LoginContext;
|
||||||
import cn.stylefeng.roses.kernel.auth.api.pojo.login.LoginUser;
|
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.api.pojo.tenant.TenantTableProperties;
|
||||||
|
import cn.stylefeng.roses.kernel.db.mp.tenant.holder.TenantIdHolder;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
|
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
|
||||||
import net.sf.jsqlparser.expression.Expression;
|
import net.sf.jsqlparser.expression.Expression;
|
||||||
import net.sf.jsqlparser.expression.LongValue;
|
import net.sf.jsqlparser.expression.LongValue;
|
||||||
|
@ -30,6 +31,14 @@ public class ProjectTenantInterceptor implements TenantLineHandler {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Expression getTenantId() {
|
public Expression getTenantId() {
|
||||||
|
|
||||||
|
// 1. 优先从线程变量中获取,这个优先级最高
|
||||||
|
Long tenantId = TenantIdHolder.get();
|
||||||
|
if (ObjectUtil.isNotEmpty(tenantId)) {
|
||||||
|
return new LongValue(tenantId);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 从LoginUser中获取tenantId
|
||||||
LoginUser loginUserNullable = LoginContext.me().getLoginUserNullable();
|
LoginUser loginUserNullable = LoginContext.me().getLoginUserNullable();
|
||||||
if (loginUserNullable == null) {
|
if (loginUserNullable == null) {
|
||||||
return 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;
|
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.constants.SysConstants;
|
||||||
import cn.stylefeng.roses.kernel.sys.api.expander.TenantConfigExpander;
|
import cn.stylefeng.roses.kernel.sys.api.expander.TenantConfigExpander;
|
||||||
import cn.stylefeng.roses.kernel.sys.modular.menu.entity.SysMenu;
|
import cn.stylefeng.roses.kernel.sys.modular.menu.entity.SysMenu;
|
||||||
|
@ -77,10 +78,15 @@ public class InitAdminService {
|
||||||
// 找到默认系统租户下,后台管理员角色id
|
// 找到默认系统租户下,后台管理员角色id
|
||||||
LambdaQueryWrapper<SysRole> queryWrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<SysRole> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
queryWrapper.eq(SysRole::getRoleCode, SysConstants.BACKEND_ADMIN_ROLE_CODE);
|
queryWrapper.eq(SysRole::getRoleCode, SysConstants.BACKEND_ADMIN_ROLE_CODE);
|
||||||
// 默认根租户
|
SysRole superAdminRole;
|
||||||
queryWrapper.eq(SysRole::getTenantId, TenantConfigExpander.getDefaultRootTenantId());
|
try {
|
||||||
|
// 设置一个默认根租户
|
||||||
|
TenantIdHolder.set(TenantConfigExpander.getDefaultRootTenantId());
|
||||||
queryWrapper.select(SysRole::getRoleId);
|
queryWrapper.select(SysRole::getRoleId);
|
||||||
SysRole superAdminRole = sysRoleService.getOne(queryWrapper);
|
superAdminRole = sysRoleService.getOne(queryWrapper);
|
||||||
|
} finally {
|
||||||
|
TenantIdHolder.remove();
|
||||||
|
}
|
||||||
|
|
||||||
// 获取所有的菜单和功能
|
// 获取所有的菜单和功能
|
||||||
List<SysMenu> totalMenuList = sysMenuService.getTotalMenuList();
|
List<SysMenu> totalMenuList = sysMenuService.getTotalMenuList();
|
||||||
|
|
Loading…
Reference in New Issue