match陈述式中的变数无法正常运作

时间:2019-01-29 13:43:06

标签: firebase google-cloud-firestore firebase-security-rules

如果我尝试查询文档,此代码会给我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 ->
  ...
}

第一个代码有什么问题?

1 个答案:

答案 0 :(得分:0)

您的代码正在尝试获取tasks集合中的所有任务。但是似乎您打算让安全规则基于对规则的评估来过滤任务。这不是安全规则的工作原理。来自documentation

  

在编写查询以检索文档时,请记住安全性   规则不是过滤器-查询全部或全部。为了节省您的时间,   资源,Cloud Firestore根据潜在查询评估查询   结果集,而不是所有您的实际字段值   文件。如果查询可能返回文档,   客户端没有读取权限,整个请求失败。

因此,可能发生的情况是当前用户的查询在至少一个文档上失败,这导致整个查询失败。您的查询需要具体说明其知道应该访问哪些文档,或者需要重组数据以适合您的查询。