Skip to main content

权限系统简介

本系统的权限为 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}}}',
};

以上的例子代表该用户:

  1. 在销售表中,不能看到 ID 为 3 的产品的销售记录。返回给该用户的总销售额中也不包含 ID 为 3 的产品销售额。
  2. 在库存表中,只允许该用户看今年的库存记录。此表达方式为动态变化的,如今年是 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 也会被相应的修改。

前端添加列权限注意事项。

系统通过下划线表达关联的方式去控制关联的实体表内的维度权限。

比如销售表关联了产品实体,你想要给用户产品的分类的数据权限,那么你可以这么写:

产品_分类 等于 女装

![权限配置示例](images/handbook/权限.png)

输入图片说明