Firestore规则:如何根据包含子集合的文档字段允许访问子集合?

时间:2019-07-16 14:50:27

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

我正在编写一个反应小程序来管理各种联赛。

我的问题是如何允许正确的用户访问(读,写)联赛的比赛日。比赛日的名称为“ matchday-1”,“ matchday-2”,依此类推,是文件(比赛)的集合,并且是联赛内部的子集合。

我的 firebase结构基本上是这样的: 联赛(集合)->联赛(文件)-> Matchday-n(集合)->比赛-M(文件) 其中n和m是数字。

这是问题所在:

联赛文档包含一个名为“创建者”的字段,该字段包含创建该联赛的用户的ID。只有他们可以访问它及其比赛日!

但是看起来,当我访问比赛日时,firebase规则中resource.data.creator的值与我访问联赛本身时的值不同。

我的问题是:我必须执行哪个规则,以便只有创建联赛的用户才能访问该联赛及其子集合?

我试图找到一种方法将request.auth.uid与联盟的创建者进行比较。

我尝试过这样的条件: request.auth.uid == get("path-to-league").creator ,如您在我提供的代码中所见。 但这似乎不起作用,因为我可能错误地引用了路径。

这是我目前的代码:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /leagues/{league} {
      allow read, write: if request.auth.uid == resource.data.creator
      }
    match /leagues/{league}/{document=**} {
        allow read, write: if request.auth.uid == get(/databases/$(database)/documents/leagues/$(league)).creator
    }
  }
}

这取决于我如何摆弄规则集,但是在提供的代码的情况下,尝试访问(读取或写入)创建者错误的联赛时会遇到“缺少权限或权限不足”的情况,这很好,但即使是正确的创建者,我也无法访问比赛日。

1 个答案:

答案 0 :(得分:0)

您缺少一些语法。可能应该是这样:

match /leagues/{league}/{document=**} {
    allow read, write: if request.auth.uid ==
        get(/databases/$(database)/documents/leagues/$(league)).data.creator
}

请注意,creator之前有一个data属性。这使您可以访问文档Resource对象的原始字段值。