了解安全规则
安全规则语言
安全规则基于灵活、强大的自定义语言,可以支持各种复杂性和细化程度。我们可以按照自己应用的具体需要,设置特定的规则或者一般性的规则。安全规则语言使用一种 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 时表示允许进行操作。
默认情况下,遇到没有定义的操作类型,则拒绝该操作访问
云函数安全规则基于 JSON 结构,层级较特殊,顶级 key
为表示函数名,value 为对应函数的权限配置,也为 JSON 格式,子配置 key
为操作名(invoke),value
为 boolean
或类似 JavaScript 的表达式:
{
"*": {
"invoke": "auth!==null"
},
"function1": {
"invoke": false
},
"function3": {
"invoke": true
}
}
其中包含几个关键概念
- 函数名: JSON 顶级
key
为函数名,用于匹配获取某个具体函数的配置,特殊的允许配置*
作为函数名的通配符,当没有匹配到具体函数时将获取*
的配置,云函数安全规则中必须包含*
配置。 - 操作类型: 函数名下子配置 JSON 的
key
为操作类型,暂只支持 invoke,且必须为 invoke。 - 条件: 子配置 JSON
value
为规则条件,可以为boolean
值或逻辑表达式(组),当条件值为 true 时表示允许进行操作。表达式只支持使用auth!=null
。
条件构造
条件可以为 boolean
或表达式字符串
,表达式字符串语法类似 Javascript 语言,其是单个逻辑表达式,或多个逻辑表达式通过与/或方式组合,当表达式的计算值决定了操作是否被允许。
- 云数据库
- 云存储
- 云函数
预置变量
变量 | 类型 | 说明 |
---|---|---|
now | number | 当前时间,以从 Linux 计时原点开始计算的毫秒数表示。 |
auth | Auth | 在用户登录后,提供 uid(用户的唯一 ID)和 loginType(登录类型)。如果用户未登录,则为 null。 |
doc | Object | 代表请求数据时当前记录的对象,在条件内引用 doc 将导致最多一次从服务中读取该值。此查询将计入资源的所有与服务相关的配额。 |
request | Request | 代表请求对象,可以获取请求相关的值 |
Auth
字段名 | 类型 | 说明 |
---|---|---|
loginType | string | 登录方式 公众平台登录,开放平台登录,自定义登录,匿名登录等等 |
uid | string | 用户唯一 id,微信小程序的请求没有此值 |
openid | string | 用户 openid,仅在微信登录方式下存在值 |
LoginType 枚举
枚举值 | 登录方式说明 |
---|---|
WECHAT_PUBLIC | 微信公众号 |
WECHAT_OPEN | 微信开放平台 |
ANONYMOUS | 匿名登录 |
邮箱登录 | |
CUSTOM | 自定义登录 |
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 | 代表请求文件元数据,在条件内引用 resource 将导致最多一次从服务中读取该值。 |
Auth
字段名 | 类型 | 说明 |
---|---|---|
loginType | string | 登录方式 公众平台登录,开放平台登录,自定义登录,匿名登录等等 |
uid | string | 用户唯一 id,微信小程序的请求没有此值 |
openid | string | 用户 openid,仅在微信登录方式下存在值 |
LoginType 枚举
枚举值 | 登录方式说明 |
---|---|
WECHAT_PUBLIC | 微信公众号 |
WECHAT_OPEN | 微信开放平台 |
ANONYMOUS | 匿名登录 |
邮箱登录 | |
CUSTOM | 自定义登录 |
Resource
字段名 | 类型 | 说明 |
---|---|---|
openid | string | 文件私有归属标识,标记所有者 id |
path | string | 文件在云存储中的相对路径,路径不包含桶名 格式为 path/image.jpg,路径起始不包含 ./、/、. 等路径符 |
变量可用于规则表达式中,例如开放 public 目录下的文件所有用户可读,但限制用户写入的数据归属于自己,并且只有自己可修改。
{
"read": "/^public\\//.test(resource.path)",
"write": "resource.openid == auth.uid"
}
特殊方法
存储安全规则支持特殊的语法,在规则中可以通过字面量的方式引入正则对象(eg. /^reg\$/),并通过在正则对象上调用 test
方法校验参数是否匹配正则。
- 在规则表达式中判断
test
结果时需要显式地与true
或false
比较,例如read: "/^public/.test('public') == true"
,而不是直接写表达式read: "/^public/.test('public')"
。 - 由于安全规则表达式承载于字符串,因此正则对象中如果涉及到需要转移的字符,需要多重转义,例如:如果需要匹配字符串
test/image
, 正则对象可以为/^test\/image/
,那么配置在规则表达式中应该为"/^test\\/image/.test("test/image")"
。
预置变量
变量 | 类型 | 说明 |
---|---|---|
auth | - | 函数安全规则中 auth 只有 null 与 非 null 两种情况,不支持访问 auth 成员值 |
运算符
运算符 | 说明 | 示例 | 说明 |
---|---|---|---|
== | 等于 | auth.uid == 'zzz' | 用户的 uid 为 zzz |
!= | 不等于 | auth.uid != 'zzz' | 用户的 uid 不为 zzz |
> | 大于 | a>10 | a 值大于 10 |
>= | 大于等于 | a>=10 | a 值大于等于 10 |
< | 小于 | a<10 | a 值小于 10 |
<= | 小于等于 | a<=10 | a 值小于等于 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 |