我有一个结构如下的 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;
}
}
在我列出答案之前我会花一些时间,以防有经验的人有更好的解决方案。
答案 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()
的解决方案提出意见,那也会非常有帮助!