【问题标题】:Firestore Rules: Making documents in a collection and all subcollections follow the same ruleFirestore 规则:在集合中创建文档,所有子集合都遵循相同的规则
【发布时间】:2020-12-07 01:35:17
【问题描述】:

我正在制作一个看起来像这样的结构:

users
  user1
  user2
  user3
group
  group1
  group2
  group3
     subcollections1
        subdoc11
        subdoc12
     subcollections2
        subdoc21
        subdoc22

所以解释一下,我有一个用户集合和组集合。所有用户必须属于一个且仅一个组。一个组有一个“成员”字段,我检查用户是否是成员。

所以我现在的规则是这样的。

match /groups/{document=**} {
  allow read, write: if resource.data.users[request.auth.uid] != null;
}

我的问题是,即使在写入子集合时,它是否会准确检查用户是否在 group1->doc-'members' 中,还是会检查 group1->doc-> subcollection->doc-'members' 在那种情况下?

因为成员列表仅在组集合中,而不在子集合中,所以不需要第二种情况。

【问题讨论】:

  • 当您自己测试规则时会发生什么?我不认为它会起作用,但老实说,这是你自己很容易找到的东西。
  • @DougStevenson 我将自己测试它,但老实说,它给我的印象是这应该通过以下方式实现:当它是组的文档时,读入 resource.data 当它是子集合时, 使用 get() 函数获取组的文档。这个问题是希望有知识的人能给我一个确认或建议。
  • Stack Overflow 的目的是帮助人们处理无法按预期方式工作的代码(提供调试细节),而不是预测某些代码是否会按预期工作。我建议阅读:stackoverflow.com/help/how-to-ask

标签: google-cloud-firestore firebase-security


【解决方案1】:

虽然我还没有真正尝试过,但resource.data 变量是对正在访问的文档的引用。因此,如果路径访问文档/groups/group3/subcollections1/subdoc11,那将是resource.data 引用的文档。因此,我认为您的规则不会按预期工作。

关于如何实现所需的行为,请注意,最好在最精细的级别定义 Firestore 规则。这将防止在应该应用更严格的规则但应用更广泛的规则时意外授予访问权限。我会建议类似的东西:

match /groups/{groupId} {
  allow read, write: if resource.data.users[request.auth.uid] != null;
}

match /groups/{groupId}/{subcollection}/{documentId} {
  allow read, write: if get(/databases/$(database)/documents/$(groupId)).data.users[request.auth.uid] != null
}

如需进一步参考,请查看有关 how rules worksample rules 的页面。

【讨论】:

  • 这会给我额外的阅读,对吧?我实际上并不介意,但我想我可能会在这里不那么严格。无论如何,我不想降低安全性,但我需要先考虑清楚。谢谢
  • @LucasNantes 是的,第二条规则意味着额外的阅读。
猜你喜欢
  • 2018-11-27
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 2020-12-18
  • 2018-09-26
  • 1970-01-01
相关资源
最近更新 更多