数据权限管理

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

说明

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

规则语法

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

{
  ".read": true, 
  ".write": "request.auth.userId==resource.auth.userId"
}

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

  • 文本内容必须是合法的JSON。

  • key代表操作类型:

    • .read :读操作。

    • .write :写操作。

    • * :所有操作。

  • 操作类型对应的取值支持:

    • true:可操作。

    • false:不可操作。

    • request.auth.userId==resource.auth.userId:即校验用户身份,只有数据归属人能操作。

匹配的优先级和限制:

  • 目前明确的操作类型只支持.read.write两种。

  • 对于操作类型,需要明确指定规则的优先,否则再进行通配符匹配。

  • 若未配置通配符,则.read.write都要明确配置权限规则。

预设权限说明

下表列举了EMAS Serverless预设的4种常用数据权限,和通过JSON自定义权限的示例。

规则名称

对应规则详情

说明

开放所有权限(需要通过自定义规则模式编写,建议仅在调试时使用)

{    
    ".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
}

所有用户不可读写。

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

关于如何修改数据库权限,请参见设置数据表权限

默认规则

对于新创建的数据库,EMAS Serverless会自动提供一个默认规则。默认所有人有读权限,仅管理员有写权限,接入测试前,需要先调整权限规则,请参见设置数据表权限

小程序云数据库默认权限

该权限对应JSON规则表达式为:

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

仅创建者可访问

如果期望某个集合中的数据,只有该数据的创建者可访问,那么需要指明权限规则为校验用户身份:request.auth.userId==resource.auth.userId 。对于预设权限,以下两种权限会使用此规则:

  • 所有用户可读,仅创建者及管理员可写。

  • 仅创建者及管理员可读写。

注意
  • .write权限(包括通配符匹配)为仅创建者可写时,创建者发起的写操作都会自动插入字段auth来存储创建者的userId,无需手动处理,且该字段不可篡改。

  • .read权限(包括通配符匹配)为仅创建者可读时,访问者只能获取到数据携带了auth字段,且auth.userId 字段和自己userId一致的数据。

  • 若用户之前写入的数据中未包含auth字段,而在某个时刻才把集合的权限调整为仅创建者可读后,用户可能将无法拉取之前上传的数据。