Преглед изворни кода

fix:【framework】修复 easy-trans 因为数据权限,导致无法读取的问题

YunaiV пре 7 месеци
родитељ
комит
24a88059fc

+ 28 - 6
yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/main/java/cn/iocoder/yudao/framework/datapermission/core/rule/DataPermissionRuleFactoryImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ArrayUtil;
 import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
 import cn.iocoder.yudao.framework.datapermission.core.aop.DataPermissionContextHolder;
+import com.fhs.trans.service.impl.SimpleTransService;
 import lombok.RequiredArgsConstructor;
 
 import java.util.Collections;
@@ -31,32 +32,53 @@ public class DataPermissionRuleFactoryImpl implements DataPermissionRuleFactory
 
     @Override // mappedStatementId 参数,暂时没有用。以后,可以基于 mappedStatementId + DataPermission 进行缓存
     public List<DataPermissionRule> getDataPermissionRule(String mappedStatementId) {
-        // 1. 无数据权限
+        // 1.1 无数据权限
         if (CollUtil.isEmpty(rules)) {
             return Collections.emptyList();
         }
-        // 2. 未配置,则默认开启
+        // 1.2 未配置,则默认开启
         DataPermission dataPermission = DataPermissionContextHolder.get();
         if (dataPermission == null) {
             return rules;
         }
-        // 3. 已配置,但禁用
+        // 1.3 已配置,但禁用
         if (!dataPermission.enable()) {
             return Collections.emptyList();
         }
+        // 1.4 特殊:数据翻译时,强制忽略数据权限 https://github.com/YunaiV/ruoyi-vue-pro/issues/1007
+        if (isTranslateCall()) {
+            return Collections.emptyList();
+        }
 
-        // 4. 已配置,只选择部分规则
+        // 2.1 情况一:已配置,只选择部分规则
         if (ArrayUtil.isNotEmpty(dataPermission.includeRules())) {
             return rules.stream().filter(rule -> ArrayUtil.contains(dataPermission.includeRules(), rule.getClass()))
                     .collect(Collectors.toList()); // 一般规则不会太多,所以不采用 HashSet 查询
         }
-        // 5. 已配置,只排除部分规则
+        // 2.2 已配置,只排除部分规则
         if (ArrayUtil.isNotEmpty(dataPermission.excludeRules())) {
             return rules.stream().filter(rule -> !ArrayUtil.contains(dataPermission.excludeRules(), rule.getClass()))
                     .collect(Collectors.toList()); // 一般规则不会太多,所以不采用 HashSet 查询
         }
-        // 6. 已配置,全部规则
+        // 2.3 已配置,全部规则
         return rules;
     }
 
+    /**
+     * 判断是否为数据翻译 {@link com.fhs.core.trans.anno.Trans} 的调用
+     *
+     * 目前暂时只有这个办法,已经和 easy-trans 做过沟通
+     *
+     * @return 是否
+     */
+    private boolean isTranslateCall() {
+        StackTraceElement[] stack = Thread.currentThread().getStackTrace();
+        for (StackTraceElement e : stack) {
+            if (SimpleTransService.class.getName().equals(e.getClassName())) {
+                return true;
+            }
+        }
+        return false;
+    }
+
 }