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

This commit is contained in:
YunaiV 2025-11-21 16:56:52 +08:00
parent ed3edaf755
commit 24a88059fc

View File

@ -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;
}
}