|
@@ -6,10 +6,12 @@ import cn.iocoder.yudao.framework.datapermission.core.config.CombinedPermissionC
|
|
|
import cn.iocoder.yudao.framework.datapermission.core.config.DevicePermissionConfig;
|
|
|
import cn.iocoder.yudao.framework.datapermission.core.rule.dept.DeptDataPermissionRule;
|
|
|
import cn.iocoder.yudao.framework.datapermission.core.rule.device.DevicePersonDataPermissionRule;
|
|
|
+import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
|
|
|
import net.sf.jsqlparser.expression.Alias;
|
|
|
import net.sf.jsqlparser.expression.Expression;
|
|
|
import net.sf.jsqlparser.expression.operators.conditional.OrExpression;
|
|
|
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.HashSet;
|
|
|
import java.util.List;
|
|
|
import java.util.Set;
|
|
@@ -43,13 +45,69 @@ public class CombinedDataPermissionRuleFactory extends DataPermissionRuleFactory
|
|
|
public List<DataPermissionRule> getDataPermissionRule(String mappedStatementId) {
|
|
|
List<DataPermissionRule> rules = super.getDataPermissionRule(mappedStatementId);
|
|
|
|
|
|
- // 关键修改:当设备规则不存在时,直接返回原始规则
|
|
|
- if (deviceRule == null || combinedConfig == null || devicePermissionConfig == null) {
|
|
|
+ // 关键修改:只在需要组合规则的表上应用设备规则
|
|
|
+ if (shouldApplyCombinedRule(mappedStatementId)) {
|
|
|
+ return combineRules(rules);
|
|
|
+ } else {
|
|
|
+ // 非组合表:移除设备规则
|
|
|
+ return filterDeviceRule(rules);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<DataPermissionRule> filterDeviceRule(List<DataPermissionRule> rules) {
|
|
|
+ if (deviceRule == null) return rules;
|
|
|
+ List<DataPermissionRule> filtered = new ArrayList<>(rules);
|
|
|
+ filtered.removeIf(rule -> rule == deviceRule);
|
|
|
+ return filtered;
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<DataPermissionRule> createCombinedRules(List<DataPermissionRule> originalRules) {
|
|
|
+ // 1. 复制原始规则列表,避免修改原始集合
|
|
|
+ List<DataPermissionRule> rules = new ArrayList<>(originalRules);
|
|
|
+ Set<String> combinedTables = combinedConfig.getCombinedTables();
|
|
|
+
|
|
|
+ if (CollUtil.isEmpty(combinedTables)) {
|
|
|
return rules;
|
|
|
}
|
|
|
|
|
|
- // 特殊处理:将部门规则和设备规则组合为OR关系
|
|
|
- return combineRules(rules);
|
|
|
+ // 2. 检查是否需要组合
|
|
|
+ boolean needCombine = false;
|
|
|
+ for (DataPermissionRule rule : rules) {
|
|
|
+ if (rule == deptRule || rule == deviceRule) {
|
|
|
+ for (String table : rule.getTableNames()) {
|
|
|
+ if (combinedTables.contains(table)) {
|
|
|
+ needCombine = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (needCombine) break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!needCombine) {
|
|
|
+ return rules;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 创建组合规则并替换
|
|
|
+ CombinedPermissionRule combinedRule = new CombinedPermissionRule(
|
|
|
+ deptRule, deviceRule, combinedTables, devicePermissionConfig
|
|
|
+ );
|
|
|
+
|
|
|
+ // 4. 移除原有的部门规则和设备规则
|
|
|
+ rules.removeIf(rule -> rule == deptRule || rule == deviceRule);
|
|
|
+
|
|
|
+ // 5. 添加组合规则
|
|
|
+ rules.add(combinedRule);
|
|
|
+ return rules;
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean shouldApplyCombinedRule(String mappedStatementId) {
|
|
|
+ if (deviceRule == null || combinedConfig == null || devicePermissionConfig == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ String tableName = MyBatisUtils.getTableName(mappedStatementId);
|
|
|
+ return tableName != null && combinedConfig.isCombinedTable(tableName);
|
|
|
}
|
|
|
|
|
|
private List<DataPermissionRule> combineRules(List<DataPermissionRule> rules) {
|
|
@@ -83,11 +141,12 @@ public class CombinedDataPermissionRuleFactory extends DataPermissionRuleFactory
|
|
|
);
|
|
|
|
|
|
// 4. 移除原有的部门规则和设备规则
|
|
|
- rules.removeIf(rule -> rule == deptRule || rule == deviceRule);
|
|
|
+ List<DataPermissionRule> newRules = new ArrayList<>(rules);
|
|
|
+ newRules.removeIf(rule -> rule == deptRule || rule == deviceRule);
|
|
|
|
|
|
// 5. 添加组合规则
|
|
|
- rules.add(combinedRule);
|
|
|
- return rules;
|
|
|
+ newRules.add(combinedRule);
|
|
|
+ return newRules;
|
|
|
}
|
|
|
|
|
|
/**
|