Foxnic-Web 中数据权限的使用
概述
Foxnic-Web 中所指的数据权限是指用户能够查询到的数据行的范围。在系统实施时,为了让不同的角色可以看到不同的数据,可以通过配置数据权限的方式灵活控制查询范围。下面我们来了解一下 Foxnic-Web 是如何配置和使用数据权限的。
注册环境变量
环境变量在数据权限内部进行逻辑判断和SQL的变量代入时使用。环境变量可分为全局环境变量和本地环境变量。全局环境变量注册后,可在整个应用内部使用。本地环境变量注册后,仅在对应的模块范围内使用,本地环境变量通常与 Po 来划分,即在对应的 Po 查询 Service 中可以使用。 本地环境变量
配置权限规则
1)配置数据权限规则
打开数据权限规则的基本信息,如图所示:
代码: 数据权限代码,全局唯一,会在 java 代码中代入,以指定使用哪个数据权限规则。
PO类型: 用于指定查询的对象,Po 类型的完全限定名。
2)配置范围与规则树
在系统的找到,数据权限,并进行配置:
以“我的办结流程为例”,从字面理解,流程查询范围框定在
1、流程状态必须是已经结束的;
2、当前登录人是流程审批人;
上图中只有一个范围项,那么就只有一个Select语句,当有多个范围项时,数据权限SQL构建器会生成多个Select语句,并把他们 union 起来后执行。
点击范围的“条件”按钮,打开范围配置,并中选择一个条件节点,如图所示:
条件节点的属性包括:
名称: 条件节点的名称
生效: 控制当前条件节点是否生效,即在生成SQL语句时,是否拼接。
应用条件: SpringEL表达式,要求返回一个逻辑值,如果改表达式在运行时返回 true 则当前条件节点拼接入最终的查询语句,否则不进入最终的查询语句。相 关变量可以通过“变量”黑色小按钮进行选择。选择的范围即默认的上下文环境以及手动注册的上下文环境。
测试Vo值: 指定Vo值(JSON Object 字符串),模拟前端传入的参数,点击黑色按钮“测试”测试刚刚设置的应用条件SpringEL表达式。
前置逻辑: 当前表达式出现在查询语句时使用的条件逻辑是 or 或 and。
目标属性: 即条件表达式中用于过滤的属性字段,如此处我们要求最终查询语句中出现 status='passed' 的条件表达式,那么目标属性就是 status。所以,一个条件节点仅是对一个目标属性的配置,如果要配置多个目标属性的复杂查询,则需要使用条件逻辑树。
条件类型: 条件表达式的判断方式,SQL中的比较运算符。
变量: 目标属性通过比较运算符进行=条件判断的值,要求为 JSON Array 字符串。支持常量和环境变量,如果是环境变量,需要使用 ${} 表示里面的内容是一个SpringEL 表达式,如 ["${getSession().getActivatedEmployeeId()}"]。
备注: 自定义的备注信息。
逻辑节点分两种类型,复合节点和叶子节点,复合用于组合叶子节点间的优先级,复合节点内的节点在最终的SQL语句中将被一个括号括起来。
例如,本例中最终生成的条件类似以下结构:
status='passed' and (approverEmployeeId='xxx' or approverRoleeId='xxx')
使用数据权限
配置数据权限规则以后,需要在代码中指定使用某个数据权限规则。
每一个数据权限规则,都需要设置一个代码,这个代码在程序中作为参数传入即可。
使用 chs_instance_joined 数据权限时,输出的SQL语句如下:
SELECT * FROM ( select * from ( -- 第一个范围 ( select t.* from chs_change_instance t WHERE ( ( t.deleted= 0 AND t.tenant_id= 'T001' )) AND ( ( ( t.drafter_id = '558321538131034112' ) AND ( t.drafter_id = '558321538131034112' ))) ) union -- 第二个范围 ( select t.* from chs_change_instance t WHERE ( ( t.deleted= 0 AND t.tenant_id= 'T001' )) AND ( ( ( exists( SELECT 1 FROM (select * from chs_change_approver WHERE ( approver_type = 'employee' ) AND ( deleted= 0 ) ) t_0 WHERE t.id = t_0.instance_id AND ( t_0.approver_id = '558321538131034112' ) )) OR ( exists( SELECT 1 FROM (select * from chs_change_approver WHERE ( approver_type = 'busi_role' ) AND ( deleted= 0 ) ) t_0 WHERE t.id = t_0.instance_id AND ( t_0.approver_id IN ( '498946989573017600' )) )))) ) -- 分页以及排序 ) t ORDER BY t.create_time DESC ) PAGED_QUERY LIMIT 0 , 50
使用 chs_instance_approved 数据权限时,输出的SQL语句如下:
SELECT * FROM ( -- 范围查询语句 select t.* from chs_change_instance t WHERE ( ( t.deleted= 0 AND t.tenant_id= 'T001' )) AND ( ( ( t.status = 'passed' ) AND ( ( exists( SELECT 1 FROM (select * from hrm_employee WHERE ( deleted= 0 ) AND ( tenant_id= 'T001' ) ) t_0 join (select * from chs_change_approver WHERE ( approver_type = 'employee' ) AND ( approver_type = 'employee' ) AND ( approver_type = 'employee' ) AND ( deleted= 0 ) ) t_1 on t_1.approver_id = t_0.id WHERE t.id = t_1.instance_id AND ( t_0.id = '558321538131034112' ) )) OR ( exists( SELECT 1 FROM (select * from chs_change_approver WHERE ( approver_type = 'busi_role' ) AND ( deleted= 0 ) ) t_0 WHERE t.id = t_0.instance_id AND ( t_0.approver_id IN ( '498946989573017600' )) ))))) ORDER BY t.create_time DESC -- 分页以及排序 ) PAGED_QUERY LIMIT 0 , 50
最终,查询结果按数据权限配置的范围返回。.
相关项目
https://gitee.com/LeeFJ/foxnic
https://gitee.com/LeeFJ/foxnic-web
https://gitee.com/lank/eam
https://gitee.com/LeeFJ/foxnic-samples