Firestore 安全规则“get()”不起作用?

时间:2021-02-08 19:42:38

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

我有一个结构如下的 Firestore 集合: /database/{database}/documents/group/{group}/...

每个组都有一个名为“members”的字段,它是一个用户 ID 数组:

group: {
    members: [
        "user01",
        "user02",
    ]
}

我在这个集合上有一个 iOS (Swift) 快照监听器:

Firestore.firestore().collection("group").whereField("members", arrayContains: Auth.auth().currentUser.uid)
            .addSnapshotListener {...

如果我将 Firestore 规则大部分保持打开状态,这将起作用:

match /group/{group}/{document=**} {
    allow read: if request.auth.uid != null;
}

但是,当我尝试保护集合以仅允许上述快照(而不是对集合中其他文档的请求)时,我的权限不正确。这是我尝试过的:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /group/{group}/{document=**} {
      allow read: if request.auth.uid in get(/database/$(database)/documents/group/$(group)).data.members || request.auth.uid in get(/database/$(database)/documents/group/$(group)).members;
    }
  }
}

我也试过:

match /group/{group} {
    allow read: if request.auth.uid in resource.data.members;
}

这似乎有效,但不允许我访问文档的子集合。我需要 get() 规则方法才能工作。

类似的解决方案似乎对 SO 上的其他人有效。是否有另一种方法可以允许对文档和子集合的这种类型的权限,或者我可能忽略了这个解决方案的一些明显问题?


编辑

通读more docs后,此解决方案似乎有效:

match /group/{group} {
    allow read: if request.auth.uid in resource.data.members;
    match /child_collection/{document=**} {
        allow read: if request.auth != null;
    }
}

在我列出答案之前我会花一些时间,以防有经验的人有更好的解决方案。

1 个答案:

答案 0 :(得分:1)

通读more docs后,此解决方案似乎有效:

match /group/{group} {
    allow read: if request.auth.uid in resource.data.members;
    match /child_collection/{document=**} {
        allow read: if request.auth != null;
    }
}

如果有人对使用 get() 的解决方案提出意见,那也会非常有帮助!