我想问一下保护Firestore子集合的最佳方法是什么。
这是我的问题:我有一个用户集合,其中有一个名为用户ID的文档。我在该文档中也有一个集合,其中包含一些信息,包括用户ID(再次)。有没有一种简单的方法可以访问嵌套在用户文档子集合中的每个文档?
到目前为止,我写了以下内容。我可以访问第一个文档(一个名为i6mg ...,但不能访问第二个文档DxDt ...)
match /users/{user} {
allow read: if resource.data.userId == request.auth.uid;
allow write: if false;
match /wordScores/{doc} {
allow read : if resource.data.userId == request.auth.uid;
allow write;
}
match /groupScores/{doc} {
allow read: if resource.data.userId == request.auth.uid;
allow write;
}
}
额外的问题:是否有一种方法可以保护所有文档,而不必在每个文档中都包含用户ID?
谢谢
编辑 感谢道格的建议。我添加了以下代码,并且可能遇到了其他一些问题……
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{uid}/{document=**} {
allow read: if uid == request.auth.uid;
allow write: if uid == request.auth.uid;
}
}
}
似乎我在向用户授予对子集合的访问权限,但对主集合却没有访问权限。例如,以下代码不会产生结果,并且会捕获异常
await Firestore.instance.collection('users').where('userId', isEqualTo: userId).limit(1).getDocuments();
有什么建议吗?
答案 0 :(得分:1)
如果您使用用户的UID作为其顶级文档的ID,和您希望所有子集合中的所有文档都具有与该文档相同的访问权限,请使用递归通配符:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /users/{uid}/{document=**} {
allow read: if uid == request.auth.uid;
}
}
}
您必须使用安全规则版本2来获取递归通配符语法。请注意,常规通配符只是成为可以直接在规则中使用的变量。您不必像现在一样进入文档字段。