跳到主要内容

了解安全规则

安全规则语言#

安全规则基于灵活、强大的自定义语言,可以支持各种复杂性和细化程度。我们可以按照自己应用的具体需要,设置特定的规则或者一般性的规则。安全规则语言使用一种 JSON 结构,key 指代操作类型,value 为允许操作是的条件,可以为 boolean表达式字符串,表达式字符串语法类似 Javascript 语言,其是单个逻辑表达式,或多个逻辑表达式通过与/或方式组合,当表达式的计算值决定了操作是否被允许。

由于安全规则是新的自定义语言,因此存在学习曲线。请阅读本指南,在您深入了解更复杂的规则时,可以更好地了解此规则语言。

基本结构#

安全规则基于 JSON 结构,valueboolean 或类似 JavaScript 的表达式:

{    "read": true,    "write": <<condition>>,    "create": true,    "update": false,    "delete": <<condition>>}

其中包含几个关键概念

  • 操作类型: JSON key 为支持权限控制的操作类型,createdeletereadupdate为集合的增删查改操作,write 为简便的控制集合的写权限配置,若没有配置 createdeleteupdate 操作,则按照 write 配置处理。
  • 规则: JSON value 为规则条件,可以为 boolean 值或逻辑表达式(组),当条件值为 true 时表示允许进行操作。

默认情况下,遇到没有定义的操作类型,则拒绝该操作访问

条件构造#

条件可以为 boolean表达式字符串,表达式字符串语法类似 Javascript 语言,其是单个逻辑表达式,或多个逻辑表达式通过与/或方式组合,当表达式的计算值决定了操作是否被允许。

预置变量#

变量类型说明
nownumber当前时间,以从 Linux 计时原点开始计算的毫秒数表示。
authAuth在用户登录后,提供 uid(用户的唯一 ID)和 loginType(登录类型)。如果用户未登录,则为 null。
docObject代表请求数据时当前记录的对象,在条件内引用 doc 将导致最多一次从服务中读取该值。此查询将计入资源的所有与服务相关的配额。
requestRequest代表请求对象,可以获取请求相关的值
Auth#
字段名类型说明
loginTypestring登录方式 公众平台登录,开放平台登录,自定义登录,匿名登录等等
uidstring用户唯一 id,微信小程序的请求没有此值
openidstring用户 openid,仅在微信登录方式下存在值
LoginType 枚举#
枚举值登录方式说明
WECHAT_PUBLIC微信公众号
WECHAT_OPEN微信开放平台
ANONYMOUS匿名登录
EMAIL邮箱登录
CUSTOM自定义登录
Request#
字段名类型说明
dataobject请求数据,操作类型为 create,update 时存在,代表请求是传入 data 对象

变量可用于规则表达式中,通过 docrequest.data 可以获取数据当前的值与请求传入的值,例如在订单集合中,保护订单的金额值不被篡改,可使用规则:

{    // ... //    "update": "doc.price == request.data.price || request.data.price == undefined"    // ... //}

内置方法#

目前仅支持 get 函数,唯一的参数必须为 database.集合名称.文档id。通过访问其它文档的数据来判断用户操作是否符合安全规则。

运算符#

运算符说明示例说明
==等于auth.uid == 'zzz'用户的 uid 为 zzz
!=不等于auth.uid != 'zzz'用户的 uid 不为 zzz
>大于a>10a 值大于 10
>=大于等于a>=10a 值大于等于 10
<小于a<10a 值小于 10
<=小于等于a<=10a 值小于等于 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' && a>10用户的 uid 为 zzz 并且 a 值大于 10
||或者auth.uid == 'zzz' || a>10用户的 uid 为 zzz 或者 a 值大于 10
.对象元素访问符auth.uid用户的 uid
[]数组访问符属性a[auth.uid] == 'zzz'a 对象,key 为用户 uid 的属性值为 zzz