在为Firestore项目设置规则时遇到一些麻烦。我尝试学习数据库设置,但是找不到任何解决方案。因此,当我尝试从集合“列表”中获取文档时没有问题。但是,当我尝试获取集合“列表”中的所有文档时,xcode告诉我“缺少权限或权限不足”。 我的目标是让用户能够在“列表”集合中创建文档,但他们只能读取出现在文档数组“成员”中的“列表”中的文档。
现在,我可以毫无问题地将文档添加到collection(“ lists”)中,但是我看不到它们。我只能从具有特定目标的xcode逐一读取它们。
有任何提示或想法吗?
service cloud.firestore {
match /databases/{database}/documents {
match /{documentId} {
allow read: if request.auth.uid != null;
}
match /lists/{docId} {
allow write: if request.auth.uid != null;
allow read: if request.auth.uid in resource.data.members
}
}
}
Xcode。
//working
let docRef = db.collection("lists").document("j0hHA5TLPETf6JRMbC1s")
docRef.getDocument { ...
//not working due to permission failed
db.collection("lists").getDocuments() { ...
答案 0 :(得分:2)
您的规则不起作用,因为它假设该规则将过滤掉所有不符合该规则的文档。这不是安全规则的工作方式。 Security rules are not filters.从链接的文档中:
在编写查询以检索文档时,请记住安全性 规则不是过滤器-查询全部或全部。为了节省您的时间, 资源,Cloud Firestore根据潜在查询评估查询 结果集,而不是所有您的实际字段值 文件。如果查询可能返回文档, 客户端没有读取权限,整个请求失败。
客户只能请求满足规则的文件。现在,该查询正在询问列表集合中的所有文档,而不管客户端是否有权访问它们。这将使安全规则失败,因为它试图读取它无权访问的文档。
您需要做的是使查询仅请求用户可读的文档。这意味着您可能应该在客户端上使用array-contains filter来仅匹配规则允许其读取的文档。
答案 1 :(得分:0)
实际上,您走在正确的道路上,我认为,如果您这样更改代码,它将可以正常工作。
代替此:
match /{documentId} {
allow read: if request.auth.uid != null;
}
使用此:
match /lists {
allow read: if request.auth.uid != null;
}
因此,当您尝试不使用lists
访问documentId
时,它将检查auth.uid
。
但是,当您尝试访问ex文件时。 lists/1
,它将检查该用户是否存在于数组中。