Firestore安全规则真的像意大利面条吗?

时间:2019-02-09 01:34:07

标签: firebase google-cloud-firestore firebase-security-rules

在处理Firestore Security规则时,我发现无法在字段级上指定读取/写入访问权限。 可以做的所有事情都是在文档/集合级别指定访问权限。

但是这不是强制执行真正奇怪的数据库结构吗?

考虑以下示例:

[
  {
    "id": 15,
    "name": "room1",
    "color": "red",
    "owner": "Tim"
  },
  {
    "id": 642,
    "name": "room2",
    "color": "green",
    "owner": "Charles"
  },
  {
    "id": 989,
    "name": "room3",
    "color": "blue",
    "owner": "Jane"
  }
]

在此示例中,我希望例如Jane会阅读集合中每个条目的字段id nameowner,但我不希望她看到另一个房间的字段color人。

使用这样的数据结构当然是可能的:

[
  {
    "id": 15,
    "name": "room1",
    "owner": "Tim",
    "private_values": {
      "color": "red"
    }
  },
  {
    "id": 642,
    "name": "room2",
    "private_values": {
      "color": "green"
    },
    "owner": "Charles"
  },
  {
    "id": 989,
    "name": "room3",
    "private_values": {
      "color": "blue"
    },
    "owner": "Jane"
  }
]

我所做的一切只是将“私有”值(在这种情况下仅是颜色)移动到另一个额外的集合中。 这样,我可以为根对象设置一个规则,并为对象private_values设置另一个额外的规则。

即使这完全有可能做到,但是当推断出更大的示例时,例如会有更多的用户组,他们都需要能够看到不同的字段,我认为它不是特别干净。

是否有比我刚才解释的方法更干净,更好的方法,或者还有其他我想念的东西?

致谢

1 个答案:

答案 0 :(得分:2)

您什么都没错过。这正是您应该做的。 Firestore中的文档是最精细的操作单元。

请注意,您也不能阅读部分文档(如果要阅读任何字段,则必须阅读所有字段)。如果编写的Cloud Function在文档更改时触发,则您始终会收到整个文档的内容,而对于单个字段更改时则无法编写触发器。