如果您查看https://www.firebase.com/docs/security/security-rules.html(页面底部)上的fredRef示例:
他们说第一个fredRef.set()会失败,因为它没有'last'子节点。然后他们设置了第一个和最后一个,并说它会成功。
所以我的问题是:
在第二个fredRef.set()成功或失败之后执行与第一个fredRef.set()完全相同的行,因为该集合本身没有所有数据?
答案 0 :(得分:1)
简短的回答是否定的,除非您正在编写的数据包含第一个/最后一个键,否则您将无法在任何时刻写入数据。
但是,这可能并不十分清楚,因为文档中似乎存在轻微的错误。编写安全规则的方式如下:
{
...
"name": {
// existing data must have first/last keys before write is allowed
// since validate rule is not applied to delete ops, this record can be deleted
".validate": "data.hasChildren(['first', 'last'])"
"first": { ... }
"last": { ... }
// no keys other than first/last may be written
"$other": {
".validate": false
}
}
}
在这种情况下,如果你能以某种方式在记录中获得名字和姓氏(比如作为管理员),那么在此之后的任何写入都将被允许,无论它是否具有第一个/最后一个。然而,这看起来像一个错字。而不是引用引用现有数据的data variable,我认为这是为了引用newData variable,或者是写入的数据 ,像这样:
// data to be written must have first/last keys before write is allowed
// since validate rule is not applied to delete ops, this record can be deleted
".validate": "newData.hasChildren(['first', 'last'])"
此时,newData(您写入该路径的内容)必须具有名/姓。这也假设层次结构中的某个地方存在“.write”规则,允许写访问。
该规则在教程中略高一些:
// any authenticated user can write to their own record
".write": "$user == auth.username",