为什么我无法更改Firebase参考的优先级(权限被拒绝)

时间:2014-10-10 06:17:49

标签: firebase firebase-security

在我的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 }
}

可以看出,节点既可读又可写。

1 个答案:

答案 0 :(得分:3)

问题:

“权限被拒绝”错误的原因显然在安全规则中。

问题是优先级存储在文档中很少提及的“隐藏”属性.priority中。

该属性未显示在Firebase Forge(仪表板)中,但在导出原始JSON时可以看到。

现在,指令"$other": { ".validate": false }会阻止验证nameage以外的任何属性。因此提出错误“Permission denied”。

但是,我不知道为什么在使用setValue(..., myPriority)时可以首先编写对象。这也应该导致错误。

(中途)解决方案:

现在,将新指令添加到如下所示的安全规则似乎是显而易见的:

".priority": { ".validate": true }

但这不起作用。 Firebase Forge回复:

Key names can't contain ".", "#", "$", "/", "[", or "]" (unbound names start with "$")

这意味着我们无法正确解决此问题。我们必须调整现有的安全规则,但有一些缺点:当我们想要更新优先级时,必须删除规则"$other": { ".validate": false },这使我们的验证不完整。