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

Firestore Security Rules "get()" not working?

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

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

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

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

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

如果我让 Firestore Rules 大部分时间打开,这会起作用:

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;
    }
}

我会花一些时间将其列为答案,以防更有经验的人有更好的解决方案。

通读 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() 的解决方案提出意见,那也会非常有帮助!