权限系统简介
本系统的权限为 Role Based 方式。首先需要设定角色(Role),然后再建立账号。
角色
角色规定了一系列账号在 schema 上的读写权限。 可以分别指定这个角色在各个 schema 中的读写权限。一个角色需要两个字段:
- role:角色的名称
- parent: 父角色。角色支持父子的树状结构。父子角色相关的逻辑下面章节《父子角色相关的逻辑》
- resource: 表权限。一个设定各 schema 上读写权限的字符串。
- default_query:行权限。见下文的 Defualt Query 介绍
- permissions:列权限。见下文的列权限介绍
Resource 介绍
Resource 字符串的结构示例如下:
resource = '*';
resource = '*:r';
resource = 'schema1:r|schema2|schema3:r';
resource = 'schema1:r:blacklist|schema2|schema3:r';
resource = '*:r|schema1:n';
其中,*代表全部 schema。读写权限用冒号分割,如果不写读写权限,则默认为具备写权限。如果写上:r,则代表只具备读权限。
也可以把所有具有权限的 schema 列出来。如果有 schema 没有被列出,则该角色不具备该 schema 的读写权限。这里面,schema 填写的是 schema 的_id 属性。
注意上面实例最后的resource = '*:r|schema1:n'。这种写法表示除了schema1外,角色对所有schema有读写权限。即表级别的黑名单权限控制。
blacklist部分代表列级别的权限控制(黑名单),为可选项,可以不写。可以在此设定哪些字段没有权限。例如一个用户不想让他看到销量、原价两个字段,可以这么设置:
resource = 'schema1:r:销量,原价';
这里面写的是属性的名称字段,不是属性的_id字段。
注意:目前blacklist的设置必须通过脚本去更新,今后将在页面上开放此功能。
账号
账号是具体一个用户登录时使用的。 一个账号目前仅支持一个角色。账号的字段如下:
- username: 账号用户名
- password:账号密码(用户登录后可以自行修改密码。如果系统处于 SSO 模式,则密码不起作用。可以填个 123 作为占位符。)
- role: 用户的角色
- name:显示在前端右上角的名称
- avatar:用户头像
- default_query:见下文的 Defualt Query 介绍
DefaultQuery
default query 是个一个 JSON 结构,用于精细化指定用户权限,格式如下:
interface defaultQueryType {
[schemaID: string]: QueryType(最终要JSON.stringify一下);
}
具体的例子如下:
// 半成品
default_query = {
sales: { 产品: { $ne: '3' } },
stock: { 日期: { $offset: { year: 0 } } },
};
// 最终要把query给字符串化一下(JSON.stringify)。最后保存的应该是这个:
default_query = {
sales: '{"产品":{"$ne":"3"}}',
stock: '{"日期":{"$offset":{"year":0}}}',
};
以上的例子代表该用户:
- 在销售表中,不能看到 ID 为 3 的产品的销售记录。返回给该用户的总销售额中也不包含 ID 为 3 的产品销售额。
- 在库存表中,只允许该用户看今年的库存记录。此表达方式为动态变化的,如今年是 2022 年,则该用户只能看 2022 年的库存记录。当时间到了 2023 年之后,则该用户只能看 2023 年的库存记录,不再具备 2022 年的浏览权限。
对于没有在 default_query 中提及的 schema,默认代表全部范围。
此处的 QueryType 即是 Logicform 中的 QueryType。详细的 QueryType 文档见此
用户的账号的 default_query 和角色的 default_query 有冲突时,按照用户的 default_query 来决定。
值得注意的是,最新版本中(v1.4.3_20250724版本以后),在实体表上的权限会自动推移到事件表里面该实体的权限。 除非该事件表单独有设置或者是有2个或以上该实体的字段。
列权限
列权限用来控制Schema中某一列或者是Schema相关的某一个指标是否具有可读权限。配置结构如下:
interface permissionsType {
[schemaID: string]: {
blacklist?: string[],
whiteist?: string[],
}
}
具体的例子如下:
// 半成品
permissions = {
sales: {
blacklist: ["成本"] // blacklist是黑名单的意思,代表sales这张表里面只有 **成本** 字段无权限查询
},
stock: {
whitelist: ["日期"] // whitelist是黑名单的意思,代表stock这张表里面只有 **日期** 字段有权限查询,其余字段均无权限查询
},
};
黑名单和白名单逻辑无法共存。
父子角色相关的逻辑
规则 01
子角色继承父角色的 resource 设定和 default_query 设定
规则 02
子角色可以覆盖父角色的 resource 设定和 default_query 设定
规则 03
当父角色被修改时,相关所有子角色都会被修改。
?> **注意:**如果之前有过覆盖父角色的定义,则会被重置掉
规则 04
当任意角色被修改时,账号的 default query 也会被相应的修改。
前端添加列权限注意事项。
系统通过下划线表达关联的方式去控制关联的实体表内的维度权限。
比如销售表关联了产品实体,你想要给用户产品的分类的数据权限,那么你可以这么写:
产品_分类 等于 女装

