安全规则

安全规则由开发者在控制台定义,可以用来帮助管控用户对于资源的访问,类似于身份验证体系里的 IAM 或者网络安全中的 ACL。Basement 推出了一套简明易懂、上手快的 JSON 语法让开发者能够在快速进行资源管控配置。

一组安全规则由多个子规则组成,每个子规则包含以下信息:

  • 范围:用于定义规则生效范围。
  • 操作:用于定义生效范围内的特定操作。
  • 策略:用于确定生效范围内的特定操作是否允许,而没有标记为允许的操作默认都是不允许的。
    举一个例子:现在有一批图片文件,PNG 图片只有所有者可写,所有人可读;某个特殊路径的图片只有所有者可以读写;其他文件所有人都可读写,可能会存在以下安全规则:
  1. {
  2. "/.*\.png/": { // 匹配所有 PNG 图片
  3. ".write": "request.auth.userId == resource.auth.userId", // 只有当操作者(请求来源)和资源所有者是同一个人时可写
  4. "*": true // 所有人可以进行其他操作
  5. },
  6. "xxx/yyy/zzz.jpg": { // 通过路径指定特定图片
  7. "*": "request.auth.userId == resource.auth.userId" // 只有当操作者(请求来源)和资源所有者是同一个人时可操作
  8. },
  9. "*": { // 其他所有文件类型
  10. "*": true // 所有人可以进行任何操作
  11. }
  12. }
  • 第一个规则是针对 .png 结尾的图片文件。 /..png/ 是一个正则,匹配所有 PNG 图片作为规则范围; .read 是具体操作描述, 是全部其他操作的描述,意思是:PNG 图片只有资源所有者可以进行文件写操作,所有人可以进行读取操作。
  • 第二个规则是针对 xxx/yyy/zzz.jpg 这个特定路径的图片,只有资源所有者可以进行文件读写操作。
  • 第三个规则是针对除了前两个规则匹配到的文件之外的所有文件,所有人都可以进行读写操作。
注意:JSON 结构的安全规则配置 暂不支持 // 注释 ,所以上文例子中的代码需要去除注释才能使用。

规则语法

范围

在文件存储的安全规则中,每一个规则的范围是一个文件(路径)。当规则范围是文件路径时指的是某个特定的文件,也可以是一个 JavaScript 的正则表达式指代一批文件,或者通过 * 指代所有文件。以下是三种范围书写方式的例子:

  • 字符串: xxx/yyy/zzz.jpg ,范围是这个特定文件。
  • 正则表达式: /.*.png/ ,范围是所有后缀为 .png 的文件
  • 所有文件: * 指代所有文件

操作

文件存储只有 1 种操作可以定义规则。

  • .write :写操作
  • * :所有操作
    所有人都具有文件的读权限。

策略

策略是操作是否被允许的标记,可以是一个布尔值,或者是一个表达式。当策略冲突时,以最先出现的规则策略为准。

表达式通用对象

顶级对象字段名称描述
request.authuserId请求用户 ID
resource.authuserId资源所属用户 ID

这里的 userId 指的是通过 basement.user.getInfo() 获取的 userId 字段。

表达式运算符

操作符描述匹配类型
==等于string、number
!=不等于string、number
>大于number
>=大于等于number
<小于number
<=小于等于number
!string、number

默认规则

对于新创建的服务,我们会提供一个默认规则,如下:

  1. {
  2. "*": {
  3. ".write": "request.auth.userId == resource.auth.userId"
  4. }
  5. }

默认规则的含义是:所有文件都只有资源所有者可以进行写操作,所有人可读。

原文: https://docs.alipay.com/mini/cloud-service/yf6bu6