firebase 基于子集合内的权限的Firestore查询集合

a11xaf1n  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(111)

我有一个名为“项目”的集合,其中包含一些文件。此集合中的每个文档都有一个名为“collaborators”的子集合。

project
  - document 1 {author: user x}
      collaborators
        - user 1
        - user 2
  - document 2 {author: user y}
      collaborators
        - user 3
  - ...

文档的所有者和协作者可以查看文档。我已经相应地创建了Firebase规则。

function canRead() {
  return get(/databases/$(database)/documents/project/$(ID)/collaborators/$(request.auth.uid)).data.read == true;
}
allow read: if isLoggedIn() && (request.auth.uid == resource.data.author || canRead())

我可以使用以下命令查询用户拥有的文档:

query(
  collection(db, "project"),
  where("author", "==", "<user id>")
)

但是,我不能查询用户是协作者的所有文档。删除where子句不会列出所有文档,因为Firestore规则不是过滤器。
我的另一个想法是,每当对collaborators子集合进行添加或删除操作时,都用类似sharedWith: ["user 1", "user 2", ...]的字段更新文档。然而,这样做的问题是,所有协作者都可以查看sharedWith列表,而不仅仅是作者。此外,如果协作者列表变大,这个数组也会变大+在更新这个数组时可能会出现竞争条件问题。
最好的办法是什么?

brccelvz

brccelvz1#

您的安全性可以用于读取单个文档(即,get请求),但不适用于跨多个文档的查询。
原因是Firestore查询只能过滤它返回的文档中的数据,所以它不能过滤来自collaborators子集合的数据。
通常的解决方法是在父文档本身中包含有关协作者的必要数据,并在查询和安全规则中检查这些数据。

相关问题