在我的Firebase中,我有一个看起来像这样的对象:
person
---- name
---- age
当我第一次尝试创建它时,我使用此命令:
firebaseRef.child("person").setValue(...)
工作正常。
有时候我想要优先创建这个条目,这可以这样做:
firebaseRef.child("person").setValue(..., myPriority)
这也很好。
但是,优先级应该稍后更新。我尝试了以下方法:
firebaseRef.child("person").setPriority(myPriority)
不幸的是,这失败并显示错误消息“权限被拒绝”。这是为什么?
该引用的安全规则如下:
"person": {
".read": true,
".write": true,
"name": { ".validate": "newData.isString()" }
"age": { ".validate": "newData.isNumber()" }
"$other": { ".validate": false }
}
可以看出,节点既可读又可写。
答案 0 :(得分:3)
问题:
“权限被拒绝”错误的原因显然在安全规则中。
问题是优先级存储在文档中很少提及的“隐藏”属性.priority
中。
该属性未显示在Firebase Forge(仪表板)中,但在导出原始JSON时可以看到。
现在,指令"$other": { ".validate": false }
会阻止验证name
和age
以外的任何属性。因此提出错误“Permission denied”。
但是,我不知道为什么在使用setValue(..., myPriority)
时可以首先编写对象。这也应该导致错误。
(中途)解决方案:
现在,将新指令添加到如下所示的安全规则似乎是显而易见的:
".priority": { ".validate": true }
但这不起作用。 Firebase Forge回复:
Key names can't contain ".", "#", "$", "/", "[", or "]" (unbound names start with "$")
这意味着我们无法正确解决此问题。我们必须调整现有的安全规则,但有一些缺点:当我们想要更新优先级时,必须删除规则"$other": { ".validate": false }
,这使我们的验证不完整。