const uid = Firebase.auth().currentUser.uid
const itemId = Firebase.database().ref('user_items/' +uid+ '/items').push().key
Firebase.database().ref('user_items/' +uid+ '/items/' +itemId)
.set({
BUTTS: Firebase.database.ServerValue.TIMESTAMP,
foo: 'bar'
})
我有验证规则,不应该允许“BUTTS”作为键。当我运行下面的代码时,我在console
中收到错误(正如预期的那样)...但我的child_added
侦听器仍然会发出 gluteus maximalistic 新数据。< / p>
这是预期的行为吗?我应该听一个不同的事件吗?
编辑:添加我的规则
{
"rules": {
"users": {
"$user": {
".read": "$user === auth.uid",
".write": "$user === auth.uid",
}
},
"user_items": {
"$user": {
".read": "auth.uid === $user",
".write": "auth.uid === $user",
"items": {
"$item": {
".validate": "newData.hasChildren(['a', 'foo'])",
"$other": {
".validate": "false"
},
".read": "auth.uid === $user",
".write": "auth.uid === $user",
"a": {
".validate": "newData.isString()"
},
"foo": {
".validate": "newData.isString()"
}
}
}
}
}
}
}
答案 0 :(得分:1)
是的,这是预期的行为。这一切都在Firebase blog post中进行了解释。
在服务器而不是客户端上强制执行权限。为了提高响应能力,当客户端检测到更改时,侦听器会立即触发。如果服务器拒绝更改,则会通知客户端并触发侦听器事件以撤消更改。这在博客文章末尾进行了总结:
当对具有活动侦听器的位置进行更新时 在同一过程中,通过该过程的数据流如下 这样:
- 立即使用新值调用所有相关的侦听器
- 将更新发送到Firebase服务器端
- 检查安全规则的有效性
- 如果违反了安全规则,请通知客户端SDK
- 通过再次调用相关的侦听器以回到原始状态来回滚应用程序中的更改
醇>
您需要侦听child_added
和child_removed
个事件,并根据需要做出响应以处理权限失败。