小程序Serverless提供了一套简明易懂的JSON语法用来控制用户对资源的访问,类似于身份验证体系里的IAM或者网络权限中的ACL。您可以在控制台上通过修改默认权限规则来管理数据表的权限。

规则语法

一组权限规则通常由数据库集合和权限操作组成:

{
    "db": {
        "${collection}": {
            ".read": true, 
            ".write": "request.auth.userId == resource.auth.userId", 
            "*": false
        }, 
        "*": {
            ".read": true, 
            ".write": false, 
            "*": false
        }
    }
}       
  • JSON的第一层级key是数据库集合名称,代表进行权限管理的范围。
    说明 "*" 代表没有匹配到集合名的默认集合。
  • JSON 第二层级key代表操作类型:
    • .read :读操作
    • .write :写操作
    • * :所有操作
    操作取值支持:truefalserequest.auth.userId == resource.auth.userId
    说明 当将写入操作的规则设置为“request.auth.userId == resource.auth.userId”,会在写入的文档中加入字段"auth": { "userId": "${userId}" 。

    如果读操作的规则也设置为“request.auth.userId == resource.auth.userId”,且该用户不是写入数据的User ID,则无法读取该数据。

匹配规则

当第一层级匹配到集合后:

  • 匹配当前集合中对应的操作类型。若当前集合中没有匹配到操作类型,会查找当前集合中 "*" 操作类型。
  • 没有匹配后继续查找第一层级 "*" 集合中对应的操作类型。若还是没有匹配的操作,继续查找第一层级中 "*" 集合中 "*" 操作类型。
  • 若上述所有规则都未匹配,拒绝请求。

当第一层级没有匹配到指定的集合:

  • 查找第一层级中 "*" 集合中对应的操作类型,没有匹配到操作类型,继续查找第一层级中 "*" 集合中的 "*" 操作类型。
  • 若上述所有规则都未匹配,拒绝请求。

修改权限规则

修改权限规则的数据影响如下:

  • 当从更严格的定义修改为更宽泛的定义,如将request.auth.userId == resource.auth.userId 修改为 true,此时可以拿到更多的数据。
  • 如果从更宽泛的定义修改为更严格的定义,很可能造成查询数据缺失,如将true修改为request.auth.userId == resource.auth.userId

下表列举了常用的数据权限管理规则配置及其权限说明。关于如何修改数据库权限,请参见设置数据表权限

规则设置 说明

".read": true

".write": true

所有用户都对该数据表拥有全部读写权限。
说明 该权限规则会放开数据库操作权限,请谨慎设置。

".read": true

".write": "request.auth.userId == resource.auth.userId"

所有用户都可以读写指定的数据表,但只允许写入数据的用户更新自己插入的数据。

".read": "request.auth.userId == resource.auth.userId",

".write": "request.auth.userId == resource.auth.userId"

只有数据写入用户可以更新、读取自己写入的数据。

".read": "request.auth.userId == resource.auth.userId",

".write": true

所有用户都可以在指定的数据表中写入数据,但只允许指定的用户读取数据。
注意 不推荐使用该权限规则,因为此种规则在写入数据的时候没有用户ID这个字段,所以用户是无法读取到数据的。

规则示例

  • 场景一
    权限规则如下:
    {
        "db": {
            "posts": {
                ".write": "request.auth.userId == resource.auth.userId"
            }, 
            "*": {
                "*": false
            }
        }
    }
    插入如下一条数据:
    {
       "title": "文章标题",
       "content": "文章内容"
    }

    posts集合中插入数据后的数据库内容如下:

    {
       "title": "文章标题",
       "content": "文章内容",
       "auth": {
           "userId": "${userId}"
       }
    }

    由于posts集合的权限规则中未定义 ".read" 与 "*" 操作类型,继续查找结合 "*" 中的 ".read" 操作类型,仍然未匹配,继续查找集合 "*" 中的 "*" 操作类型,值为false,拒绝请求。也就是说此时posts是只允许插入不允许读取的。

  • 场景二
    权限规则如下:
    {
        "db": {
            "posts": {
                ".write": "request.auth.userId == resource.auth.userId", 
                ".read": true
            }, 
            "*": {
                "*": false
            }
        }
    }
    posts集合中插入如下一条数据:
    {
       "title": "文章标题",
       "content": "文章内容"
    }

    插入数据后的数据库内容如下:

    {
       "title": "文章标题",
       "content": "文章内容",
       "auth": {
           "userId": "${userId}"
       }
    }

    由于posts集合权限规则中定义 ".read" 操作类型为true,所以可以读取所有数据。

  • 场景三
    权限规则如下:
    {
        "db": {
            "posts": {
                ".write": "request.auth.userId == resource.auth.userId", 
                ".read": "request.auth.userId == resource.auth.userId"
            }, 
            "*": {
                "*": false
            }
        }
    }
    posts集合中插入如下一条数据:
    {
       "title": "文章标题",
       "content": "文章内容"
    }

    插入数据后的数据库内容如下:

    {
       "title": "文章标题",
       "content": "文章内容",
       "auth": {
           "userId": "${userId}"
       }
    }

    由于posts集合权限规则中定义 ".read" 操作类型为"request.auth.userId == resource.auth.userId",所以仅可以读取当前操作用户创建的数据。

  • 场景四
    权限规则如下:
    {
        "db": {
            "posts": {
                ".write": true, 
                ".read": true
            }, 
            "*": {
                "*": false
            }
        }
    }
    posts集合中插入如下一条数据:
    {
       "title": "文章标题",
       "content": "文章内容"
    }

    插入数据后的数据库内容如下:

    {
       "title": "文章标题",
       "content": "文章内容"
    }

    由于posts集合权限规则中定义 ".read" 操作类型为true,所以可以读取所有数据。

默认规则

对于新创建的服务,小程序Serverless会自动提供一个默认规则。默认没有任何读写权限,请先修改权限规则。

操作详情,请参见修改数据表权限

{
  "db": {
    "*": {
      "*": false
    }
  }
}