跳到主要内容

了解安全规则

安全规则语言

安全规则基于灵活、强大的自定义语言,能够支持各种复杂度和精细化程度的权限控制。开发者可以根据应用的具体需求,设置特定的规则或一般性的规则。安全规则使用 JSON 结构,其中:

  • key 指代操作类型(如读取、写入等)
  • value 为允许操作的条件,可以是:
    • 简单的 boolean 值(true/false)
    • 类似 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当前操作的记录对象,引用时会从服务中读取一次,此查询会计入相关资源配额
requestRequest请求对象,包含请求相关的各种信息
Auth
字段名类型说明
loginTypestring登录方式,如公众平台登录、开放平台登录、自定义登录、匿名登录等
uidstring用户唯一标识ID,注意:微信小程序请求中不包含此值
openidstring用户的微信openid,仅在微信相关登录方式下存在
LoginType 枚举值
枚举值登录方式
WECHAT_PUBLIC微信公众号
WECHAT_OPEN微信开放平台
ANONYMOUS匿名登录
EMAIL邮箱登录
CUSTOM自定义登录
Request
字段名类型说明
dataobject请求传入的数据对象,仅在 create 和 update 操作类型时存在

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

{
// ... 其他规则 ... //
"update": "doc.price == request.data.price || request.data.price == undefined"
// ... 其他规则 ... //
}

这条规则确保:要么请求不修改价格字段,要么修改后的价格与原价格相同。

内置方法

目前仅支持 get 函数,该函数接受一个参数,格式必须为 database.集合名称.文档id。通过此函数,您可以访问其它文档的数据,用于判断当前操作是否符合安全规则。

例如,检查用户是否有权限修改特定文档:

{
"update": "get(`database.users.${auth.uid}`).role == 'admin'"
}

运算符

运算符说明示例含义说明
==等于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 [])不存在于集合中!(auth.uid in ['zzz','aaa'])用户的 uid 不在 ['zzz','aaa'] 集合中
&&逻辑与(AND)auth.uid == 'zzz' && a>10用户的 uid 为 'zzz' 并且 a 值大于 10
||逻辑或(OR)auth.uid == 'zzz' || a>10用户的 uid 为 'zzz' 或者 a 值大于 10
.对象属性访问符auth.uid访问 auth 对象的 uid 属性
[]对象属性或数组元素访问a[auth.uid] == 'zzz'对象 a 中键名为用户 uid 的属性值等于 'zzz'