我有一个名为“项目”的集合,其中包含一些文件。此集合中的每个文档都有一个名为“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列表,而不仅仅是作者。此外,如果协作者列表变大,这个数组也会变大+在更新这个数组时可能会出现竞争条件问题。
最好的办法是什么?
1条答案
按热度按时间brccelvz1#
您的安全性可以用于读取单个文档(即,
get
请求),但不适用于跨多个文档的查询。原因是Firestore查询只能过滤它返回的文档中的数据,所以它不能过滤来自
collaborators
子集合的数据。通常的解决方法是在父文档本身中包含有关协作者的必要数据,并在查询和安全规则中检查这些数据。