安全规则
安全规则由开发者在控制台定义,可以用来帮助管控用户对于资源的访问,类似于身份验证体系里的 IAM 或者网络安全中的 ACL。Basement 推出了一套简明易懂、上手快的 JSON 语法让开发者能够在快速进行资源管控配置。
一组安全规则由多个子规则组成,每个子规则包含以下信息:
- 范围:用于定义规则生效范围。在数据存储的安全规则中,每一个规则的范围是集合(collection)。
- 操作:用于定义生效范围内的特定操作。
- 策略:用于确定生效范围内的特定操作是否允许,而没有标记为允许的操作默认都是不允许的。
举一个例子:现在有一个留言集合,所有人可读,但只有创建者本人能够修改(可写),可能会存在以下安全规则:
{
"comments": { // 规则的范围是 comment 这个集合
".read": true, // 所有人可读
".write": "request.auth.userId == resource.auth.userId", // 只有当操作者(请求来源)和资源所有者是同一个人时可写
"*": true // 所有人可以进行其他操作
},
"*": { // 规则的范围是所有集合
"*": true // 所有人可以进行任何操作
}
}
- 第一个规则针对的是 comments 这个集合的范围;
.read
和.write
是具体操作描述,*
是全部其他操作的描述,意思是:comments 这个集合内,只有资源所有者可以进行数据写操作,所有人可以进行读取和集合操作。 - 第二个规则是针对所有集合的,因为上一条规则已经对 comments 进行了描述,所以这里指的是对 comments 集合之外的规则。意思是:comments 之外的所有即可,所有人都可以进行任何操作。
注意:JSON 结构的安全规则配置 暂不支持 // 注释 ,所以上文例子中的代码需要去除注释才能使用。
规则语法
范围
在数据存储的安全规则中,每一个规则的范围是集合(collection)。当规则范围是集合名称时指的是某个特定的集合,也可以是一个 JavaScript 的正则表达式指代一批集合,或者通过 *
指代所有集合。以下是三种范围书写方式的例子:
- 集合名称:
comments
,范围是 comments 集合。 - 正则表达式:
/user.*/
,范围是 user 开头的所有集合 - 所有集合:
*
指代所有集合
操作
数据存储有 3 种操作可以定义规则。
.read
:读操作.write
:写操作.aggregate
:聚合操作*
:所有操作
策略
策略是操作是否被允许的标记,可以是一个布尔值,或者是一个表达式。当策略冲突时,以最先出现的规则策略为准。
表达式通用对象
顶级对象 | 字段名称 | 描述 |
---|---|---|
request.auth | userId | 请求用户 ID |
resource.auth | userId | 资源所属用户 ID |
这里的 userId
指的是通过 basement.user.getInfo() 获取的 userId 字段。
表达式运算符
操作符 | 描述 | 匹配类型 |
---|---|---|
== | 等于 | string、number |
!= | 不等于 | string、number |
> | 大于 | number |
>= | 大于等于 | number |
< | 小于 | number |
<= | 小于等于 | number |
! | 非 | string、number |
默认规则
对于新创建的服务,我们会提供一个默认规则,如下:
{
"*": {
".read": "request.auth.userId == resource.auth.userId",
".write": "request.auth.userId == resource.auth.userId",
"*": true
}
}
默认规则的含义是:所有集合都只有资源所有者可以进行读写操作,而所有人可以进行聚合操作。