安全规则语言
安全规则基于灵活、强大的自定义语言,可以支持各种复杂性和细化程度。我们可以按照自己应用的具体需要,设置特定的规则或者一般性的规则。安全规则语言使用一种 JSON 结构,key 指代操作类型,value 为允许操作时的条件,可以为 boolean 或表达式字符串,表达式字符串语法类似 Javascript 语言,其是单个逻辑表达式,或多个逻辑表达式通过与/或方式组合,当表达式的计算值决定了操作是否被允许。
由于安全规则是新的自定义语言,请阅读本指南,在您深入了解更复杂的规则时,可以更好地了解此规则语言。
基本结构
云数据库
安全规则基于 JSON 结构,value 为 boolean 或类似 JavaScript 的表达式:
{"read": true,"write": <<condition>>,"create": true,"update": false,"delete": <<condition>>}
其中包含几个关键概念:
操作类型: JSON key 为支持权限控制的操作类型,create、delete、read、update为集合的增删查改操作,write 为简便的控制集合的写权限配置,若没有配置 create、delete、update 操作,则按照 write 配置处理。
规则: JSON value 为规则条件,可以为 boolean 值或逻辑表达式(组),当条件值为 true 时表示允许进行操作。
默认情况下,遇到没有定义的操作类型,则拒绝该操作访问。
云存储
安全规则基于 JSON 结构,value 为 boolean 或类似 JavaScript 的表达式:
{"read": true,"write": <<condition>>,}
其中包含几个关键概念:
操作类型: JSON key 为支持权限控制的操作类型,read、write为云存储文件的读写操作。
条件: JSON value 为规则条件,可以为 boolean 值或逻辑表达式(组),当条件值为 true 时表示允许进行操作。
默认情况下,遇到没有定义的操作类型,则拒绝该操作访问。
条件构造
条件可以为 boolean 或表达式字符串,表达式字符串语法类似 Javascript 语言,其是单个逻辑表达式,或多个逻辑表达式通过与/或方式组合,当表达式的计算值决定了操作是否被允许。
云数据库
预置变量
Auth
字段名 | 类型 | 说明 |
loginType | string | 登录方式 公众平台登录,开放平台登录,自定义登录,匿名登录等。 |
uid | string | 用户唯一 ID,微信小程序的请求没有此值。 |
openid | string | 用户 openid,仅在微信登录方式下存在值。 |
Request
字段名 | 类型 | 说明 |
data | object | 请求数据,操作类型为 create,update 时存在,代表请求是传入 data 对象 |
变量可用于规则表达式中,通过 doc 与 request.data 可以获取数据当前的值与请求传入的值,例如在订单集合中,保护订单的金额值不被篡改,可使用规则:
{// ... //"update": "doc.price == request.data.price || request.data.price == undefined"// ... //}
内置方法
云函数
预置变量
Auth
字段名 | 类型 | 说明 |
loginType | string | 登录方式 公众平台登录,开放平台登录,自定义登录,匿名登录等。 |
uid | string | 用户唯一 ID,微信小程序的请求没有此值。 |
openid | string | 用户 openid,仅在微信登录方式下存在值。 |
Resource
字段名 | 类型 | 说明 |
openid | string | 文件私有归属标识,标记所有者 ID |
变量可用于规则表达式中,例如限制用户写入的数据归属于自己,并且只有自己可修改。
{{"write": "resource.openid == auth.uid"}
运算符
运算符 | 说明 | 示例 | 示例解释(集合查询) |
== | 等于 | auth.uid == 'zzz' | 用户的 uid 为 zzz |
!= | 不等于 | auth.uid != 'zzz' | 用户的 uid 不为 zzz |
> | 大于 | doc.age > 10 | 查询条件的 age 属性大于 10 |
>= | 大于等于 | doc.age >= 10 | 查询条件的 age 属性大于等于 10 |
< | 小于 | doc.age < 10 | 查询条件的 age 属性小于 10 |
<= | 小于等于 | doc.age <= 10 | 查询条件的 age 属性小于等于 10 |
in | 存在于集合中 | auth.uid in ['zzz','aaa'] | 用户的 uid 是['zzz','aaa']中的一个 |
!(xx in []) | 不存在于集合中,使用 in 的方式描述 !(a in [1,2,3]) | !(auth.uid in ['zzz','aaa']) | 用户的 uid 不是['zzz','aaa']中的任何一个 |
&& | 与 | auth.uid == 'zzz' && doc.age>10 | 用户的 uid 为 zzz 并且查询条件的 age 属性大于 10 |
|| | 或者 | auth.uid == 'zzz' || doc.age>10 | 用户的 uid 为 zzz 或者查询条件的 age 属性大于 10 |
. | 对象元素访问符 | auth.uid | 用户的 uid |
[] | 数组访问符属性 | get('database.collection_a.user')[auth.uid] == 'zzz' | collection_a 集合中 id 为 user 的文档,key 为用户 uid 的属性值为 zzz |