Firebase 用于查询属于登录用户的集合(列表)的Firestore权限和规则

Firebase 用于查询属于登录用户的集合(列表)的Firestore权限和规则,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,我正在构建一个联系人管理器,其中用户的地址簿中有一堆“联系人”。我只希望创建联系人的用户能够查询该联系人。我在下面写了一个查询,说明了我希望它做什么,但是这个查询不起作用,我也不知道为什么 所有联系人都是使用与创建联系人的用户的uid相对应的owner\u id字段创建的 service cloud.firestore { match /databases/{database}/documents { match /contacts/{contactId} { /

我正在构建一个联系人管理器,其中用户的地址簿中有一堆“联系人”。我只希望创建联系人的用户能够查询该联系人。我在下面写了一个查询,说明了我希望它做什么,但是这个查询不起作用,我也不知道为什么

所有联系人都是使用与创建联系人的用户的
uid
相对应的
owner\u id
字段创建的

service cloud.firestore {
  match /databases/{database}/documents {
    match /contacts/{contactId} {
          // only allow read for contacts if the current user is the owner
          allow read: if request.auth.uid == resource.data.owner_id // <-- this does not work
          allow write: if request.auth.uid != null && request.resource.data.owner_id != null;
    }
  }
}
我还尝试过限制使用where子句:

db.collections('contacts').where('owner_id', '==', <hard-coded-owner-id>)
db.collections('contacts')。其中('owner_id','=',)
我应该注意到,当我查询单个文档时,上面的语法似乎确实有效。当我查询集合时,它似乎失败了

所以我的问题是,如何编写一个数据库规则,这样我就可以列出集合中的所有项,而只返回与登录用户关联的项


我预计您的第一个查询会失败,因为它实际上是在试图访问它没有读取权限的文档。您的规则不会隐式过滤结果


我希望您的第二个查询能够工作,因为它只访问权限允许的文档。但是,只有当Firebase身份验证报告的有效UID与您硬编码的UID相同时,它才会起作用。这就是您要验证的规则-登录用户仅尝试读取所有者id中存在的文档。如果您在控制台模拟器中工作,您必须打开身份验证并在表单中放入正确的UID。

我预计您的第一个查询会失败,因为它实际上是在尝试访问它没有读取权限的文档。您的规则不会隐式过滤结果


我希望您的第二个查询能够工作,因为它只访问权限允许的文档。但是,只有当Firebase身份验证报告的有效UID与您硬编码的UID相同时,它才会起作用。这就是您要验证的规则-登录用户仅尝试读取所有者id中存在的文档。如果您在控制台模拟器中工作,则必须打开身份验证并在表单中输入正确的UID。

您似乎忘记在此处显示查询。@DougStevenson更新。谢谢。@samcorcos你把这个整理好了吗?“我有完全相同的问题。看来你忘了在这里显示你的查询了。”DougStevenson更新。谢谢。@samcorcos你把这个整理好了吗?我也有同样的问题。“你的规则不会隐式过滤结果。”明白了。这解释了很多。我尝试过使用模拟器,但它似乎只适用于
get
,而不适用于
list
,因此我无法测试它。“您的规则不会隐式过滤结果。”明白了。这解释了很多。我尝试过使用模拟器,但它看起来只适用于
get
,而不适用于
list
,所以我无法测试它。
db.collections('contacts').where('owner_id', '==', <hard-coded-owner-id>)