原生jeecg-boot多表联查配置数据权限时,有可能权限字段重复。
报错信息如下:
### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'sys_org_code' in order where is ambiguous
网上查了一下没找到解决方案,只好顺着权限控制的源码理看看怎么解决。
QueryGenerator的installMplus方法实现了数据权限匹配,匹配权限规则是直接读取的Bean字段名。我想,能不能改造成通过反射来读取注解的值,覆盖掉原来的匹配规则,就可以解决字段重复了。
原版代码
//数据权限查询
if(ruleMap.containsKey(name)) {
addRuleToQueryWrapper(ruleMap.get(name), name, origDescriptors[i].getPropertyType(), queryWrapper);
}
新建个注解
package org.jeecg.common.aspect.annotation;
import java.lang.annotation.*;
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface AliasRuleField {
String value() default "";
}
将原来的代码改成
//数据权限查询
String tableFieldId = null;
try {
Field f = searchObj.getClass().getDeclaredField(name);
AliasRuleField aliasRuleField = f.getAnnotation(AliasRuleField.class);
if (aliasRuleField != null)
tableFieldId = aliasRuleField.value();
} catch (NoSuchFieldException ignored) { }
if (StringUtils.isEmpty(tableFieldId)){
tableFieldId = name;
}
if(ruleMap.containsKey(tableFieldId)) {
addRuleToQueryWrapper(ruleMap.get(tableFieldId), tableFieldId, origDescriptors[i].getPropertyType(), queryWrapper);
}
同时在实体类重复的字段上加个注解
@AliasRuleField(value = "teaching_user_work.sysOrgCode")
private String sysOrgCode;
配置数据规则字段时sysOrgCode改为teaching_user_work.sysOrgCode
这样,遇到重复的字段,只需要加个AliasRuleField注解就可以解决了!
============
还有一种比较简单的做法
数据权限直接使用自定义SQL
上面的就可以写为:
sys_depart.org_code like '%#{sys_org_code}%
发表评论
抢沙发~