读写权限控制 编辑文档

本篇文档介绍规则表达式的基础知识,以及如何设置数据的读写权限。

规则表达式类型

设置数据读写权限,使用规则表达式的以下两种类型:

规则类型 描述
.read 定义数据是否可以读取,默认为 false。
.write 定义数据是否可以写入,默认为 false。

规则表达式使用 JSON 格式,与你的数据结构相对应:

{
"rules": {
"foo": {
// 设置 /foo/ 下数据可读
".read": true,
// 设置 /foo/ 下数据可写
".write": true,
// 设置 /foo/ 下数据必须为 string 类型,并且长度少于 100 个字符。
".validate": "newData.isString() && newData.val().length < 100"
}
}
}

内置对象

规则表达式中提供了许多内置对象。利用这些内置对象提供的方法和属性,你可以配置各种规则。

内置对象包含以下六个:

内置对象 描述
now 代表云端的时间戳,以毫秒为单位。
root RuleDataSnapshot类型的对象,代表根节点/的数据引用。
newData RuleDataSnapshot类型的对象,代表数据操作之后的新数据引用。
data RuleDataSnapshot类型的对象,代表数据操作前的原始数据引用。
$variables 通配变量。代表节点列表下某个相同的键 (key) 。
auth 代表已登录用户对象。

内置对象的使用,请参考 规则表达式 API 文档

$ 通配符

$ 通配符用于代表一个或多个匹配的节点。

例如,配置一个留言墙的读写权限。
数据结构如下:

{
"messageboard": {
"message0": {
"content": "Hello",
"timestamp": 1405704370369,
"uid":17343512
},
"message1": {
"content": "Goodbye",
"timestamp": 1405704395231,
"uid":72366233
},
...
}
}

使用 $ 可以代表所有 message 节点:

{
"rules": {
"messageboard": {
"$message_id": {
".read": true,
".write": false
}
}
}
}

使用 $other 代表未列出的子节点:

{
"rules": {
"messageboard": {
"message0": {
".read": true,
".write": true
}
"$other": {
".read": false
".write": false
}
}
}
}

规则的级联性

级联规则是指节点上设置的读写权限为 true 时在其子节点上同样生效,并且会覆盖其子节点已有权限。

例如,message 节点已经设置为可读,那么无论子节点如何设置,子节点都可读:

"rules": {
"message": {
// 允许 /message/ 节点下的数据被读取
".read": "data.child('content').val() === true",
"content": {
// 当父节点的表达式授予了读权限时,这一规则设置 false 无效。
".read": false
}
}
}
}


注意:


.validate 规则不会进行级联。

规则的原子性

规则的原子性是指父节点没有读写权限时,即使所有子节点都有读写权限,在父节点的读写操作也会完全失败

例如,读取 /messageboard 节点的数据,由于 /messageboard 节点没有读权限,所以读操作失败:

{
"rules": {
// 无法读取 /messageboard 节点的数据。
"messageboard": {
"message1": {
// 可以直接成功读取 /messageboard/message1 节点的数据。
".read": true
},
"message2": {
".read": false
}
}
}
}
野狗新手?
立即注册,为你提供安全可靠的实时通信云服务。
没找到需要的文档?
你可以提交工单反馈 或 阅读常见问题