小程序云Serverless提供了一套简明易懂的安全规则方案用来控制小程序端侧用户对资源的访问,保障数据安全,概念上近似于Linux的文件权限体系。对于云数据库,您可以在控制台上通过配置权限规则来管理数据集合的读写权限。

说明 从控制台、云函数或者管控SDK发起的数据库操作,不受此安全规则限制。

规则语法

目前数据库的访问权限是在数据库粒度上配置的,通过一个JSON规则来表达数据库中不同集合和不同操作的访问限制,例如。

{
    "db": {
        "collection1": {
            ".read": true,
            ".write": "request.auth.userId==resource.auth.userId"
        },
        "collection2": {
            "*": false
        },
        "collection3": {
            "*": true
        },
        "collection4": {
            ".read": true,
            ".write": false
        },
        "*": {
            ".read": true,
            ".write": false
        }
    }
}

用JSON来表达权限规则的语法约定为:

  • 文本内容必须是合法的JSON。
  • 对于云数据库,JSON的第1级key默认为db
  • 第2级key是数据库集合名称,表示该规则应用在哪个集合上。可以使用通配符“*”,匹配任意集合。
  • 第3层级key代表操作类型:
    • .read :读操作。
    • .write :写操作。
    • * :所有操作。
  • 操作类型对应的取值支持:
    • true:可操作。
    • false:不可操作。
    • request.auth.userId==resource.auth.userId:即校验用户身份,只有数据归属人能操作。
匹配的优先级和限制:
  • 无论是集合名还是操作类型,明确指定规则的优先,否则再进行通配符匹配。
  • 对于集合,若未配置通配符,则每个集合都要做权限规则配置。
  • 对于操作类型,若未配置通配符,则.read.write都要明确配置权限规则。

修改权限规则

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

规则设置 说明
{    
    ".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": true,
  ".write": false
}

所有用户只读。

适用场景:商品信息等。

{
  ".read": false,
  ".write": false
}

所有用户不可读写。

适用场景:仅从业务后端写入后台数据流水、日志等。

规则示例

权限规则示例如下:
{
    "db": {
        "test": {
            ".write": true, 
            ".read": true
        }, 
        "comments": {
        	".read": true,
          	".write": "request.auth.userId==resource.auth.userId"
        },
        "*": {
            ".read": true,
            "*": false
        }
    }
}

其中:

  • test集合设为公开读写,任何用户都可以读写其中的数据。
  • comments集合设为公开读,创建者可读写。
  • 该服务空间对应数据库的其它集合都属于只读状态,只能通过控制台、管控SDK或云函数对其进行修改。

默认规则

对于新创建的数据库,小程序Serverless会自动提供一个默认规则。默认所有集合只有读权限,没有写权限,接入测试前,需要先调整权限规则,请参见设置数据表权限

默认权限规则如下。

{
  "db": {
    "*": {
      ".read": true,
      ".write": false
    }
  }
}

仅创建者可访问

如果期望某个集合中的数据,只有该数据的创建者可访问,那么需要指明权限规则为校验用户身份:request.auth.userId==resource.auth.userId

注意
  • .write权限(包括通配符匹配)为仅创建者可写时,创建者发起的写操作都会自动插入字段auth来存储创建者的userId,无需手动处理,且该字段不可篡改。
  • .read权限(包括通配符匹配)为仅创建者可读时,访问者只能获取到数据携带了auth字段,且auth.userId 字段和自己userId一致的数据。
  • 若用户之前写入的数据中未包含auth字段,而在某个时刻才把集合的权限调整为仅创建者可读后,用户可能将无法拉取之前上传的数据。