|
|
|
@ -1,6 +1,7 @@
|
|
|
|
|
package org.dromara.common.tenant.helper;
|
|
|
|
|
|
|
|
|
|
import cn.dev33.satoken.context.SaHolder;
|
|
|
|
|
import cn.dev33.satoken.stp.StpUtil;
|
|
|
|
|
import cn.hutool.core.convert.Convert;
|
|
|
|
|
import com.alibaba.ttl.TransmittableThreadLocal;
|
|
|
|
|
import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy;
|
|
|
|
@ -13,7 +14,6 @@ import org.dromara.common.core.utils.SpringUtils;
|
|
|
|
|
import org.dromara.common.core.utils.StringUtils;
|
|
|
|
|
import org.dromara.common.redis.utils.RedisUtils;
|
|
|
|
|
import org.dromara.common.satoken.utils.LoginHelper;
|
|
|
|
|
import org.springframework.web.context.request.RequestContextHolder;
|
|
|
|
|
|
|
|
|
|
import java.util.function.Supplier;
|
|
|
|
|
|
|
|
|
@ -82,10 +82,13 @@ public class TenantHelper {
|
|
|
|
|
/**
|
|
|
|
|
* 设置动态租户(一直有效 需要手动清理)
|
|
|
|
|
* <p>
|
|
|
|
|
* 如果为非web环境 那么只在当前线程内生效
|
|
|
|
|
* 如果为未登录状态下 那么只在当前线程内生效
|
|
|
|
|
*/
|
|
|
|
|
public static void setDynamic(String tenantId) {
|
|
|
|
|
if (!isWeb()) {
|
|
|
|
|
if (!isEnable()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (!isLogin()) {
|
|
|
|
|
TEMP_DYNAMIC_TENANT.set(tenantId);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
@ -97,10 +100,13 @@ public class TenantHelper {
|
|
|
|
|
/**
|
|
|
|
|
* 获取动态租户(一直有效 需要手动清理)
|
|
|
|
|
* <p>
|
|
|
|
|
* 如果为非web环境 那么只在当前线程内生效
|
|
|
|
|
* 如果为未登录状态下 那么只在当前线程内生效
|
|
|
|
|
*/
|
|
|
|
|
public static String getDynamic() {
|
|
|
|
|
if (!isWeb()) {
|
|
|
|
|
if (!isEnable()) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
if (!isLogin()) {
|
|
|
|
|
return TEMP_DYNAMIC_TENANT.get();
|
|
|
|
|
}
|
|
|
|
|
String cacheKey = DYNAMIC_TENANT_KEY + ":" + LoginHelper.getUserId();
|
|
|
|
@ -117,7 +123,10 @@ public class TenantHelper {
|
|
|
|
|
* 清除动态租户
|
|
|
|
|
*/
|
|
|
|
|
public static void clearDynamic() {
|
|
|
|
|
if (!isWeb()) {
|
|
|
|
|
if (!isEnable()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (!isLogin()) {
|
|
|
|
|
TEMP_DYNAMIC_TENANT.remove();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
@ -126,6 +135,34 @@ public class TenantHelper {
|
|
|
|
|
SaHolder.getStorage().delete(cacheKey);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 在动态租户中执行
|
|
|
|
|
*
|
|
|
|
|
* @param handle 处理执行方法
|
|
|
|
|
*/
|
|
|
|
|
public static void dynamic(String tenantId, Runnable handle) {
|
|
|
|
|
setDynamic(tenantId);
|
|
|
|
|
try {
|
|
|
|
|
handle.run();
|
|
|
|
|
} finally {
|
|
|
|
|
clearDynamic();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 在动态租户中执行
|
|
|
|
|
*
|
|
|
|
|
* @param handle 处理执行方法
|
|
|
|
|
*/
|
|
|
|
|
public static <T> T dynamic(String tenantId, Supplier<T> handle) {
|
|
|
|
|
setDynamic(tenantId);
|
|
|
|
|
try {
|
|
|
|
|
return handle.get();
|
|
|
|
|
} finally {
|
|
|
|
|
clearDynamic();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取当前租户id(动态租户优先)
|
|
|
|
|
*/
|
|
|
|
@ -137,11 +174,13 @@ public class TenantHelper {
|
|
|
|
|
return tenantId;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 判断是否web环境
|
|
|
|
|
*/
|
|
|
|
|
private static boolean isWeb() {
|
|
|
|
|
return RequestContextHolder.getRequestAttributes() != null;
|
|
|
|
|
private static boolean isLogin() {
|
|
|
|
|
try {
|
|
|
|
|
StpUtil.checkLogin();
|
|
|
|
|
return true;
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|