Firebase安全性 - 当您在Firebase上验证孩子时,您是否需要每套数据?

时间:2014-01-12 15:58:05

标签: firebase

如果您查看https://www.firebase.com/docs/security/security-rules.html(页面底部)上的fredRef示例:

他们说第一个fredRef.set()会失败,因为它没有'last'子节点。然后他们设置了第一个和最后一个,并说它会成功。

所以我的问题是:

在第二个fredRef.set()成功或失败之后执行与第一个fredRef.set()完全相同的行,因为该集合本身没有所有数据?

1 个答案:

答案 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",