使用
一、功能说明
列表数据权限,主要通过数据权限控制行数据,让不同的人有不同的查看数据规则;
比如: 销售人员只能看自己的数据;销售经理可以看所有下级销售人员的数据;财务只看金额大于5000的数据等等;
二、规则字段配置说明(非常重要):
①条件规则:大于/大于等于/小于/小于等于/等于/包含/模糊/不等于
②规则值:指定值 ( 固定值/系统上下文变量 )
日期默认值格式:2020-04-10
时间默认值格式:2020-04-13 12:00:00
③条件规则是包含: 规则值用逗号分隔
1.当前用户上下文变量
注意:数据权限配置,规则值可以填写系统上下文变量(当前登录人信息),从而根据当前登录人信息进行权限控制。
三、编码 描述(动态)
sys_user_code 当前登录用户登录账号
sys_user_name 当前登录用户真实名称
sys_date 当前系统日期
sys_time 当前系统时间
sys_org_code 当前登录用户部门编号
sys_multi_org_code 当前登录用户拥有的所有机构编码,逗号分隔
tenant_id 当前登录用户租户ID 要求:3.4.5 版本+
规则值,配置写法如下:#{sys_user_code}
注意:如果需要通过当前登录人、登录部门,进行数据权限控制,则业务表必须有以下系统标准字段;比如:创建人,创建时间,创建人所属部门,有了这些标准字段,就可以通过当前登录人进行数据隔离控制;
银轮为例:
订单池订单输入页面要控制普通人员自己只能看自己录入的,
计划员可以看自己部门的。
1:建表时,在数据库表中必须有创建人编号,部门编号。
2:在页面中配置数据规则:
3:在需要约束数据权限的页面的查询接口上开启使用数据权限:
这个语句内部去查了数据权限,必须写!不写数据权限不会起作用。
最后根据构造的查询器执行查询就可以根据权限查出数据了。
原理
一:数据权限获取:**
1:切注解
使用切面:切注解:@PermissionData
public Object arround(ProceedingJoinPoint point)
ProceedingJoinPoint point
2:参数准备
获取切面 被切的注解
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
if (method != null)
{
xxxxxx annoObj= method.getAnnotation(xxxxxx.class);
}
return null;
3:查询数据权限(根据获取的注解的参数,用户数据。
当注解中没有配置参数时,会使用requestPath不过此时就是另一种配置权限的方式了)
//
List<SysPermissionDataRuleModel> dataRules = commonAPI.queryPermissionDataRule(component, requestPath, username);
if(dataRules!=null && dataRules.size()>0) {
/**
* 临时存储, 往请求里面,传入数据查询条件 request.setAttribute(MENU_DATA_AUTHOR_RULES, dataRules); 在后面会再从request中取出来使用
*/
JeecgDataAutorUtils.installDataSearchConditon(request, dataRules);
SysUserCacheInfo userinfo = commonAPI.getCacheUser(username);
JeecgDataAutorUtils.installUserInfo(request, userinfo);
}
4:执行查询并存储入request
JeecgDataAutorUtils.installDataSearchConditon(request, dataRules); request.setAttribute(MENU_DATA_AUTHOR_RULES, list);
/**
* 往链接请求里面,传入数据查询条件
*
* @param request
* @param dataRules
*/
public static synchronized void installDataSearchConditon(HttpServletRequest request, List<SysPermissionDataRuleModel> dataRules) {
@SuppressWarnings("unchecked")
List<SysPermissionDataRuleModel> list = (List<SysPermissionDataRuleModel>)loadDataSearchConditon();// 1.先从request获取MENU_DATA_AUTHOR_RULES,如果存则获取到LIST
if (list==null) {
// 2.如果不存在,则new一个list
list = new ArrayList<SysPermissionDataRuleModel>();
}
for (SysPermissionDataRuleModel tsDataRule : dataRules) {
list.add(tsDataRule);
}
request.setAttribute(MENU_DATA_AUTHOR_RULES, list); // 3.往list里面增量存指
}
二:数据规则进行拼接
QueryGenerator.applyPermissionWrapper(autoQueryWrappe
/**
* 获取请求对应的数据权限规则
*
* @return
*/
@SuppressWarnings("unchecked")
public static synchronized List<SysPermissionDataRuleModel> loadDataSearchConditon() {
return (List<SysPermissionDataRuleModel>) SpringContextUtils.getHttpServletRequest().getAttribute(MENU_DATA_AUTHOR_RULES);
}