统治Firestore,从父母那里获取资源?

时间:2019-09-29 15:54:43

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

我正在尝试为我的应用设置安全规则。

我有一个看起来像这样的收藏集:

Scores
  |          
  |                  
  |                  
  |
  |___ AutoID______________history
  |     |___value: 22         |__20190506
  |     |___userID: "abc"     |___dateString:20190506
  |___ AutoID                 |___value:22
          |___value: 45
          |___userID: "def"

我认为这样做可以:

match /scores/{docID=**} {
    allow read: if userIsLoggedIn();
    allow create, update: if request.resource.data.userID == request.auth.uid;
    allow delete: if resource.data.userID == request.auth.uid;
}

用户可以达到分数,但{历史记录” Collection则无法达到。 我认为问题来自resource.data.userID

Collection“历史”无法访问resource.data.userID。我想从父文档访问resource.data.userID

有可能这样做吗?

1 个答案:

答案 0 :(得分:1)

如果您要使用的文档字段不在该规则检查的具有读写访问权限的文档中,则您必须get()另一个文档(即使它位于父文档中)路径)使用其完整路径,以便您可以在规则中使用其字段值。在有关accessing other documents的文档中了解更多信息。

如果您在规则中不使用glob通配符,而是通过名称调用子集合,则可能会更容易,因此您可以使用单个通配符值更轻松地构建父文档的路径。像这样:

match /scores/{scoreId}/history/{id} {
  allow create, update:
    if get(/databases/$(database)/documents/scores/$(scoreId)).data.userID == request.auth.uid;
}

这不是一个确切的规则,但我希望您能在这里看到我在做什么,以便制定自己的规则。