如果我尝试查询文档,此代码会给我PERMISSION_DENIED
match /tasks/{task}{
allow read, write: if task in get(/databases/$(database)/documents/users/$(request.auth.uid)).data.members;
}
,而且,如果我尝试以下代码,则可以使用
match /tasks/{task}{
allow read, write: if "1jKpWhAqIzY0TspshKao" in get(/databases/$(database)/documents/users/$(request.auth.uid)).data.members;
}
字符串"1jKpWhAqIzY0TspshKao"
是文档的名称/ ID
/ tasks / {taskid}
{
owner: "4v8Bz4dsvtg4jG3l8nih71MRwy49",
taskId: "1jKpWhAqIzY0TspshKao",
title: "Some task"
}
/ users / {userid}
{
email: "email@gmail.com",
members: {
"1jKpWhAqIzY0TspshKao", "EKwNgHukewtachrTfDMk" ...
}
username: "name"
}
我使用以下代码查询文档中的两个规则
db.collection("tasks").get().addOnSuccessListener { querySnapshot ->
...
}
第一个代码有什么问题?
答案 0 :(得分:0)
您的代码正在尝试获取tasks
集合中的所有任务。但是似乎您打算让安全规则基于对规则的评估来过滤任务。这不是安全规则的工作原理。来自documentation:
在编写查询以检索文档时,请记住安全性 规则不是过滤器-查询全部或全部。为了节省您的时间, 资源,Cloud Firestore根据潜在查询评估查询 结果集,而不是所有您的实际字段值 文件。如果查询可能返回文档, 客户端没有读取权限,整个请求失败。
因此,可能发生的情况是当前用户的查询在至少一个文档上失败,这导致整个查询失败。您的查询需要具体说明其知道应该访问哪些文档,或者需要重组数据以适合您的查询。