add 新增 TenantHelper 支持动态切换租户

This commit is contained in:
疯狂的狮子li 2023-02-09 17:22:18 +08:00
parent 6938c7ef0f
commit ba89797bce
3 changed files with 77 additions and 15 deletions

View File

@ -2,6 +2,7 @@ package com.ruoyi.common.mybatis.handler;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.mybatis.helper.TenantHelper;
import com.ruoyi.common.mybatis.properties.TenantProperties; import com.ruoyi.common.mybatis.properties.TenantProperties;
import com.ruoyi.common.satoken.utils.LoginHelper; import com.ruoyi.common.satoken.utils.LoginHelper;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
@ -24,20 +25,23 @@ public class PlusTenantLineHandler implements TenantLineHandler {
@Override @Override
public Expression getTenantId() { public Expression getTenantId() {
String tenantId = LoginHelper.getTenantId(); String tenantId = LoginHelper.getTenantId();
if (StringUtils.isNotBlank(tenantId)) { if (StringUtils.isBlank(tenantId)) {
//多租户模式租户id从当前用户获取
return new LongValue(tenantId);
}
return new NullValue(); return new NullValue();
} }
String dynamicTenantId = TenantHelper.getDynamic();
if (StringUtils.isBlank(dynamicTenantId)) {
// 返回动态租户
return new LongValue(dynamicTenantId);
}
// 返回固定租户
return new LongValue(tenantId);
}
@Override @Override
public boolean ignoreTable(String tableName) { public boolean ignoreTable(String tableName) {
String tenantId = LoginHelper.getTenantId(); String tenantId = LoginHelper.getTenantId();
// 判断是否有租户 // 判断是否有租户
if (StringUtils.isNotBlank(tenantId)) { if (StringUtils.isNotBlank(tenantId)) {
// 判断是否平台超级管理员如果是平台超级管理员则拥有所有数据权限
if (!LoginHelper.isAdmin()) {
// 不需要过滤租户的表 // 不需要过滤租户的表
List<String> excludes = tenantProperties.getExcludes(); List<String> excludes = tenantProperties.getExcludes();
// 非业务表 // 非业务表
@ -47,7 +51,6 @@ public class PlusTenantLineHandler implements TenantLineHandler {
)); ));
return excludes.contains(tableName); return excludes.contains(tableName);
} }
}
return true; return true;
} }

View File

@ -1,8 +1,11 @@
package com.ruoyi.common.mybatis.helper; package com.ruoyi.common.mybatis.helper;
import cn.dev33.satoken.context.SaHolder;
import cn.dev33.satoken.stp.StpUtil;
import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy; import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy;
import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
import com.ruoyi.common.core.utils.SpringUtils; import com.ruoyi.common.core.utils.SpringUtils;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.mybatis.properties.TenantProperties; import com.ruoyi.common.mybatis.properties.TenantProperties;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@ -17,6 +20,8 @@ public class TenantHelper {
private static final TenantProperties PROPERTIES = SpringUtils.getBean(TenantProperties.class); private static final TenantProperties PROPERTIES = SpringUtils.getBean(TenantProperties.class);
private static final String DYNAMIC_TENANT_KEY = "dynamicTenant";
/** /**
* 租户功能是否启用 * 租户功能是否启用
*/ */
@ -37,4 +42,33 @@ public class TenantHelper {
public static void disableIgnore() { public static void disableIgnore() {
InterceptorIgnoreHelper.clearIgnoreStrategy(); InterceptorIgnoreHelper.clearIgnoreStrategy();
} }
/**
* 设置动态租户
*/
public static void setDynamic(String tenantId) {
StpUtil.getTokenSession().set(DYNAMIC_TENANT_KEY, tenantId);
}
/**
* 获取动态租户(多级缓存)
*/
public static String getDynamic() {
String tenantId = (String) SaHolder.getStorage().get(DYNAMIC_TENANT_KEY);
if (StringUtils.isNotBlank(tenantId)) {
return tenantId;
}
tenantId = (String) StpUtil.getTokenSession().get(DYNAMIC_TENANT_KEY);
SaHolder.getStorage().set(DYNAMIC_TENANT_KEY, tenantId);
return tenantId;
}
/**
* 清除动态租户
*/
public static void clearDynamic() {
SaHolder.getStorage().delete(DYNAMIC_TENANT_KEY);
StpUtil.getTokenSession().delete(DYNAMIC_TENANT_KEY);
}
} }

View File

@ -15,6 +15,7 @@ import com.ruoyi.common.log.annotation.Log;
import com.ruoyi.common.log.enums.BusinessType; import com.ruoyi.common.log.enums.BusinessType;
import com.ruoyi.common.mybatis.core.page.PageQuery; import com.ruoyi.common.mybatis.core.page.PageQuery;
import com.ruoyi.common.mybatis.core.page.TableDataInfo; import com.ruoyi.common.mybatis.core.page.TableDataInfo;
import com.ruoyi.common.mybatis.helper.TenantHelper;
import com.ruoyi.common.web.core.BaseController; import com.ruoyi.common.web.core.BaseController;
import com.ruoyi.system.domain.bo.SysTenantBo; import com.ruoyi.system.domain.bo.SysTenantBo;
import com.ruoyi.system.domain.bo.SysUserBo; import com.ruoyi.system.domain.bo.SysUserBo;
@ -22,6 +23,7 @@ import com.ruoyi.system.domain.vo.SysTenantVo;
import com.ruoyi.system.service.ISysTenantService; import com.ruoyi.system.service.ISysTenantService;
import com.ruoyi.system.service.ISysUserService; import com.ruoyi.system.service.ISysUserService;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -134,4 +136,27 @@ public class SysTenantController extends BaseController {
@PathVariable Long[] ids) { @PathVariable Long[] ids) {
return toAjax(sysTenantService.deleteWithValidByIds(List.of(ids), true)); return toAjax(sysTenantService.deleteWithValidByIds(List.of(ids), true));
} }
/**
* 动态切换租户
*
* @param tenantId 租户ID
*/
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
@GetMapping("/dynamic/{tenantId}")
public R<Void> dynamicTenant(@NotBlank(message = "租户ID不能为空") @PathVariable String tenantId) {
TenantHelper.setDynamic(tenantId);
return R.ok();
}
/**
* 清除动态租户
*/
@SaCheckRole(TenantConstants.SUPER_ADMIN_ROLE_KEY)
@GetMapping("/dynamic/clear")
public R<Void> dynamicClear() {
TenantHelper.clearDynamic();
return R.ok();
}
} }