From 32743d8a76ae827d1940ca503079f185b3f7896e Mon Sep 17 00:00:00 2001 From: amadeus5201 <1491459939@qq.com> Date: Fri, 16 Aug 2024 17:29:23 +0800 Subject: [PATCH] =?UTF-8?q?fix=3D>=E6=9D=83=E9=99=90=E5=92=8C=E7=A7=9F?= =?UTF-8?q?=E6=88=B7=E5=8F=AF=E4=BB=A5=E5=90=8C=E6=97=B6=E5=BF=BD=E7=95=A5?= =?UTF-8?q?=EF=BC=8C=E5=B9=B6=E4=B8=94=E5=8F=AF=E9=87=8D=E5=A4=8D=E5=BF=BD?= =?UTF-8?q?=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mybatis/helper/DataPermissionHelper.java | 45 ++++++++++++++++++- .../common/tenant/helper/TenantHelper.java | 45 ++++++++++++++++++- 2 files changed, 86 insertions(+), 4 deletions(-) diff --git a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java index 2afe9ee47..fe0c224fa 100644 --- a/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java +++ b/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/helper/DataPermissionHelper.java @@ -2,14 +2,17 @@ package org.dromara.common.mybatis.helper; import cn.dev33.satoken.context.SaHolder; import cn.dev33.satoken.context.model.SaStorage; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy; import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper; import lombok.AccessLevel; import lombok.NoArgsConstructor; +import org.dromara.common.core.utils.reflect.ReflectUtils; import java.util.HashMap; import java.util.Map; +import java.util.Objects; import java.util.function.Supplier; /** @@ -24,6 +27,8 @@ public class DataPermissionHelper { private static final String DATA_PERMISSION_KEY = "data:permission"; + private static final ThreadLocal REENTRANT_IGNORE_PERMISSION = new ThreadLocal<>(); + /** * 从上下文中获取指定键的变量值,并将其转换为指定的类型 * @@ -70,14 +75,50 @@ public class DataPermissionHelper { * 开启忽略数据权限(开启后需手动调用 {@link #disableIgnore()} 关闭) */ public static void enableIgnore() { - InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().dataPermission(true).build()); + ThreadLocal IGNORE_STRATEGY_LOCAL = (ThreadLocal) ReflectUtils.getStaticFieldValue(ReflectUtils.getField(InterceptorIgnoreHelper.class, "IGNORE_STRATEGY_LOCAL")); + IgnoreStrategy ignoreStrategy = IGNORE_STRATEGY_LOCAL.get(); + if (Objects.nonNull(ignoreStrategy)) { + if (!Boolean.TRUE.equals(ignoreStrategy.getDataPermission())) { + ignoreStrategy.setDataPermission(true); + REENTRANT_IGNORE_PERMISSION.set(1); + } else { + Integer count = REENTRANT_IGNORE_PERMISSION.get(); + REENTRANT_IGNORE_PERMISSION.set(count + 1); + } + } else { + InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().dataPermission(true).build()); + REENTRANT_IGNORE_PERMISSION.set(1); + } } /** * 关闭忽略数据权限 */ public static void disableIgnore() { - InterceptorIgnoreHelper.clearIgnoreStrategy(); + ThreadLocal IGNORE_STRATEGY_LOCAL = (ThreadLocal) ReflectUtils.getStaticFieldValue(ReflectUtils.getField(InterceptorIgnoreHelper.class, "IGNORE_STRATEGY_LOCAL")); + IgnoreStrategy ignoreStrategy = IGNORE_STRATEGY_LOCAL.get(); + if (Objects.nonNull(ignoreStrategy)) { + Integer count = REENTRANT_IGNORE_PERMISSION.get(); + boolean hasCount = count.compareTo(1) > 0; + if (ignoreStrategy.getBlockAttack() == null && ignoreStrategy.getDynamicTableName() == null && ignoreStrategy.getTenantLine() == null && ignoreStrategy.getIllegalSql() == null && CollectionUtil.isEmpty(ignoreStrategy.getOthers())) { + if (!hasCount) { + InterceptorIgnoreHelper.clearIgnoreStrategy(); + } + } else { + if (!hasCount) { + if (count.compareTo(1) == 0) { + ignoreStrategy.setDataPermission(null); + REENTRANT_IGNORE_PERMISSION.remove(); + } + } + } + if (hasCount) { + REENTRANT_IGNORE_PERMISSION.set(count - 1); + } + } else { + InterceptorIgnoreHelper.clearIgnoreStrategy(); + REENTRANT_IGNORE_PERMISSION.remove(); + } } /** diff --git a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java index 9d087e113..64de20c23 100644 --- a/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java +++ b/ruoyi-common/ruoyi-common-tenant/src/main/java/org/dromara/common/tenant/helper/TenantHelper.java @@ -1,6 +1,7 @@ package org.dromara.common.tenant.helper; import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.convert.Convert; import com.alibaba.ttl.TransmittableThreadLocal; import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy; @@ -11,9 +12,11 @@ import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.core.utils.reflect.ReflectUtils; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.satoken.utils.LoginHelper; +import java.util.Objects; import java.util.function.Supplier; /** @@ -29,6 +32,8 @@ public class TenantHelper { private static final ThreadLocal TEMP_DYNAMIC_TENANT = new TransmittableThreadLocal<>(); + private static final ThreadLocal REENTRANT_IGNORE_TENANT = new ThreadLocal<>(); + /** * 租户功能是否启用 */ @@ -40,14 +45,50 @@ public class TenantHelper { * 开启忽略租户(开启后需手动调用 {@link #disableIgnore()} 关闭) */ public static void enableIgnore() { - InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build()); + ThreadLocal IGNORE_STRATEGY_LOCAL = (ThreadLocal) ReflectUtils.getStaticFieldValue(ReflectUtils.getField(InterceptorIgnoreHelper.class, "IGNORE_STRATEGY_LOCAL")); + IgnoreStrategy ignoreStrategy = IGNORE_STRATEGY_LOCAL.get(); + if (Objects.nonNull(ignoreStrategy)) { + if (!Boolean.TRUE.equals(ignoreStrategy.getTenantLine())) { + ignoreStrategy.setTenantLine(true); + REENTRANT_IGNORE_TENANT.set(1); + } else { + Integer count = REENTRANT_IGNORE_TENANT.get(); + REENTRANT_IGNORE_TENANT.set(count + 1); + } + } else { + InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build()); + REENTRANT_IGNORE_TENANT.set(1); + } } /** * 关闭忽略租户 */ public static void disableIgnore() { - InterceptorIgnoreHelper.clearIgnoreStrategy(); + ThreadLocal IGNORE_STRATEGY_LOCAL = (ThreadLocal) ReflectUtils.getStaticFieldValue(ReflectUtils.getField(InterceptorIgnoreHelper.class, "IGNORE_STRATEGY_LOCAL")); + IgnoreStrategy ignoreStrategy = IGNORE_STRATEGY_LOCAL.get(); + if (Objects.nonNull(ignoreStrategy)) { + Integer count = REENTRANT_IGNORE_TENANT.get(); + boolean hasCount = count.compareTo(1) > 0; + if (ignoreStrategy.getBlockAttack() == null && ignoreStrategy.getDynamicTableName() == null && ignoreStrategy.getIllegalSql() == null && ignoreStrategy.getDataPermission() == null && CollectionUtil.isEmpty(ignoreStrategy.getOthers())) { + if (!hasCount) { + InterceptorIgnoreHelper.clearIgnoreStrategy(); + } + } else { + if (!hasCount) { + if (count.compareTo(1) == 0) { + ignoreStrategy.setTenantLine(null); + REENTRANT_IGNORE_TENANT.remove(); + } + } + } + if (hasCount) { + REENTRANT_IGNORE_TENANT.set(count - 1); + } + } else { + InterceptorIgnoreHelper.clearIgnoreStrategy(); + REENTRANT_IGNORE_TENANT.remove(); + } } /**