了解安全规则

最近更新时间:2023-06-12 16:01:38

我的收藏

安全规则语言

安全规则基于灵活、强大的自定义语言,可以支持各种复杂性和细化程度。我们可以按照自己应用的具体需要,设置特定的规则或者一般性的规则。安全规则语言使用一种 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 语言,其是单个逻辑表达式,或多个逻辑表达式通过与/或方式组合,当表达式的计算值决定了操作是否被允许。

云数据库

预置变量

变量
类型
说明
now
number
当前时间,以从 Linux 计时原点开始计算的毫秒数表示。
auth
Auth
在用户登录后,提供 uid(用户的唯一 ID)和 login
doc
Object
代表请求数据时当前记录的对象,在条件内引用 doc 将导致最多一次从服务中读取该值。此查询将计入资源的所有与服务相关的配额。
request
Request
代表请求对象,可以获取请求相关的值

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

内置方法

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

云函数

预置变量

变量
类型
说明
now
number
当前时间,以从 Linux 计时原点开始计算的毫秒数表示。
auth
Auth
在用户登录后,提供 uid(用户的唯一 ID)和 loginType(登录类型)。如果用户未登录,则为 null。
resource
代表请求文件元数据,在条件内引用 resource 将导致最多一次从服务中读取该值。

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