【问题标题】:Cannot Query in Firestore Rules Using Claims无法使用声明在 Firestore 规则中查询
【发布时间】:2020-04-07 19:53:54
【问题描述】:

在我的 Firestore 规则中,这允许我查询所有用户“组织”的列表:

match /organizations/{orgId}{
  allow read: if request.auth.uid in resource.data.members;
}

其中 members 是一组用户 ID。

但是,如果我将其更改为使用声明:

match /organizations/{orgId}{
  allow read: if orgId in request.auth.token.organizations;
}

其中 organizations 是组织 ID 的列表。

它似乎适用于:

match /organizations/{orgId}{
  allow read: if request.auth.token.organizations[orgId] == true;
}

它将让我访问文档,但不是文档列表。有没有办法解决这个问题?

【问题讨论】:

  • 仅供参考:如果您要对问题进行补充或更改,您可以直接编辑问题而不是添加评论。
  • 感谢@DougStevenson 还在学习!

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


【解决方案1】:

这不起作用,因为security rules are not filters。 (请务必阅读该链接中的文档。)另请阅读更多 here

当您对集合(不是单个文档获取)执行查询时,查询的过滤器必须绝对匹配规则的要求,然后才能知道任何文档的内容。安全规则不会从结果中删除单个文档。在这方面,Firestore 查询是“全有或全无” - 要么所有请求的文档都提前知道匹配,要么整个查询失败。

您现在所知道的建议应该读取每个文档 ID,并单独与组织列表进行比较,以确定应该返回哪些 ID。由于规则不会执行此过滤,因此它只是简单地完全拒绝查询。

您可能应该做的只是为用户声明中的每个组织 ID 创建一个 get()。绝对可以在客户端应用程序中读取自定义声明。

【讨论】:

  • 我的备份是一次获取。但是为什么当我使用键/值对时它现在可以工作了?
  • “当我使用键/值对时”是什么意思?
  • 我添加到我的问题中 - 就像您在上面的评论中明确告诉我的那样?
  • 好的,所以,听起来您的第一个问题已得到解答(为什么该规则不起作用)。如果您对新代码有第二个问题,请单独发布。 Stack Overflow 不是一个很好的持续提问论坛。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
  • 2018-07-14
  • 2021-03-25
  • 1970-01-01
  • 2018-07-17
  • 1970-01-01
相关资源
最近更新 更多