共享规则
通过共享规则,您可以为用户进行对象权限外的共享设置。使用共享规则,使这些用户可以访问他们不拥有或通常无法查看的记录。
要配置共享规则,请在”设置“应用中进入”对象设置→对象“界面,点击要设置相关规则的对象名称进入对象设置界面,然后在底部可以看到”共享规则“子表,在这里新建相关规则即可:
- API名称 唯一标识名称,需要符合API命名规范。
- 启用 勾选表示立刻启用规则。
- 指定条目条件 用于配置该规则生效的条件,需输入类似
{{$user.profile !='user'}}
这种公式表达式,当条件成立时该规则才生效。 - 记录过滤器 输入要共享或限制查看的数据的过滤条件,这里也支持“指定条目条件”中一样的公式表达式语法。
指定条目条件
给共享规则设置的”指定条目条件“是一个公式表达式,华炎魔方权限引擎会执行该表达式并根据执行结果来判断是否要把规则中配置的”记录过滤器“时配置的过滤条件叠加到最终查询结果中。
公式格式
{{ javascript语法的表达式 }}
必须以 ‘{{
‘ 开头,以 ’}}
’ 结尾,其包裹的是一个标准的javascript
表达式。
支持变量
公式表达式中支持以下变量,可以直接在表达式中引用它们:
- $user :
Dictionary<any>
userSession,当前登录用户信息,详细请参考后续附录。 - global:
Dictionary<any>
全局变量,目前只支持now变量。公式表达式global.now
会输出当前时间值。
记录过滤器
给共享规则设置的”记录过滤器“是要共享或限制查看的数据的过滤条件,其语法规则请参考该文档底部 查询过滤条件详解 小节。
这里输入的内容也是支持公式表达式语法的,其表达式语法与上面提到的“指定条目条件”是一样的。
只要在华炎魔方中查询数据,华炎魔方权限引擎就会把满足”指定条目条件“的共享/限制规则中的”记录过滤器“里配置的过滤条件叠加到最终查询条件中,整个查询计算过程请参考该文档顶部提到的 权限计算 - 查询 示意图。
- 共享规则:如果配置的是共享规则,过滤条件会以
OR
的方式叠加到最终的查询过滤条件中。 - 限制规则:如果配置的是限制规则,过滤条件会以
AND
的方式叠加到最终的查询过滤条件中。
示例1
假设在某个魔方项目中有三个分部,分别表示上海总公司、南京分公司和杭州分公司,在该项目中需要通过权限配置来实现公司内部的业务管理人员可以查看本公司所有外部客户创建的合同数据。
这里说的外部客户指的是系统中简档为”customer“的用户,在不配置共享规则的情况下,我们可以按需求给”业务管理员 salesman
“这个权限集下的用户配置”合同“对象权限,勾选”查看本分部“来允许用户查看本分部的所有合同数据。
细想我们会发现需求中提的要求是业务管理员只能看到其本人创建以及外部客户创建的合同数据,并不允许其查看其他内部人员创建的合同数据。
要实现该需求,我们可以通过给合同对象配置共享规则来放大业务管理员的查看数据权限,下面我们详细讲解下这种配置方法:
要通过放大业务管理员的查看合同数据权限这种方式来实现需求的话,我们在给”业务管理员“这个权限集下配置的”合同“对象权限中,不能勾选”查看本分部“属性以确保业务管理员只有查看自己创建的合同数据这种最基本的数据查看权限,这样的话业务管理员比需求要求的权限就偏小了,我们可以给合同对象配置一个共享规则来放大其权限:
- 指定条目条件
{{$user.roles.indexOf("salesman") > -1}}
- 记录过滤器
{{[["company_id", "=", $user.company_id],["profile__c", "=", "customer"]]}}
- 描述 共享本公司所有外部客户数据。
我们看到上面无论是配置限制规则还是共享规则的方式,在过滤条件中都用到了一个名为profile__c
的字段,它是用于标识合同记录创建人的简档的自定义字段,当其简档值为customer
时就表示该合同记录是外部客户创建的。
我们需要为合同对象创建一个名为简档的相关表字段来保存合同记录创建人的简档值:
- 显示名称:简档
- 字段名:
profile__c
- 字段类型:相关表
- 默认值:
{{global.user.profile}}
这里默认值是一个表单公式。
示例2
我们可以通过给部门对象和人员对象配置共享规则,来改变这两个对象默认的权限规则。
部门
默认情况下普通用户是可以查看所有部门信息的,我们可以给部门对象配置限制规则来实现部门对象的分部级数据查看权限功能。
- 指定条目条件
{{$user.roles.indexOf('user') > -1}}
- 记录过滤器
{{[["_id", "=", $user.companies.map(function(n){return n.organization;})], "or", ["parents", "=",$user.companies.map(function(n){return n.organization;})]]}}
- 描述 限制user简档下的用户只能查看自己所属分部及其子分部下的部门信息。
PS: 这里如果通过给部门对象配置自定义对象权限,去掉“查看所有记录”勾选框,勾上“查看本分部”,而不是配置限制规则的话也能实现部门对象的分部级数据查看权限功能,但是这种配置实现的是“让user简档下的用户只能查看自己所属分部的部门信息,且不能查看其子分部下的部门信息。”
人员
默认情况下普通用户只能看到自己所属分部下的人员,但是不能查看自己所属分部的子分部下的人员,我们可以给人员对象配置共享规则来让普通用户可以额外查看自己所属分部的子分部下的人员信息。
- 指定条目条件
{{$user.roles.indexOf('user') > -1}}
- 记录过滤器
{{[["organizations_parents", "=", $user.companies.map(function(n){return n.organization;})]]}}
- 描述 给user简档下的用户共享查看自己所属分部及其子分部下的人员信息。
查询过滤条件详解
华炎魔方使用数组格式定义过滤条件。
基本运算符
"=": 等于
"!=": 不等于
">": 大于
">=": 大于等于
"<": 小于
"<=": 小于等于
"startswith": 以...开始
"contains": 包含...
"notcontains": 不包含...
between": 范围
数组类型字段
运算符为"="时,条件自动按"or"裂变连接成多个筛选条件,类似实现了"in"操作功能,所以下两种写法结果相同:
[["status", "in", ["closed","open"]]]
[ [ "status", "=", "closed" ], "or", [ "status", "=", "open" ] ]
运算符为"!="时,条件自动按"and"裂变连接成多个筛选条件,所以下两种写法结果相同:
[["status", "not in", ["closed","open"]]]
[ [ "status", "!=", "closed" ], "and", [ "status", "!=", "open" ] ]
运算符为"between"时,条件自动转换成">="及"<="运算符对应的筛选条件,以下各组效果相同:
[["age", "between", [20,30]]] 等效于 [ [ "age", ">=", 20 ], "and", [ "age", "<=", 30 ] ]
[["age", "between", [null,30]]] 等效于 [ [ "age", "<=", 30 ] ]
[["age", "between", [20,null]]] 等效于 [ [ "age", ">=", 20 ] ]
between只支持数值及日期时间类型,且过滤值必须是两个元素的数组格式
其他情况一律自动按"or"裂变连接成多个筛选条件
[["tag", "contains", ["start","end"]]] 等效于 [ [ "tag", "contains", "start" ], "or", [ "tag", "contains", "end" ] ]
“非”(not)操作
可以在当前筛选条件的基础上取反,例如:
["not", ["value", "=", 3]]
“与(and)”、“或(or)”操作
多个过滤器可以通过“与(and)”、“或(or)”操作进行组合,例如:
[ [ "value", ">", 3 ], "and", [ "value", "<", 7 ] ]
[ [ "value", ">", 7 ], "or", [ "value", "<", 3 ] ]
如果不指定“与(and)”、“或(or)”操作,系统默认按照“与(and)”操作执行过滤。所以下两种写法结果相同:
[ [ "value", ">", 3 ], "and", [ "value", "<", 7 ] ]
[ [ "value", ">", 3 ], [ "value", "<", 7 ] ]