【问题标题】:Querying with two array with firestore security rules使用 Firestore 安全规则查询两个数组
【发布时间】:2020-03-27 20:00:45
【问题描述】:

我目前在一个文档中有两个数组,一个代表产品 ID,另一个代表用户 ID。在我的查询中,我需要查询两个数组以确保 firestore 安全规则正常工作,但为此,我尝试在同一个查询中使用 array-containsin,这在文档中是可以接受的,但是当我去查询,我得到“权限缺失或不足”。

db.collection('Depots')
  .where("products", "array-contains", productId)
  .where("users", "in", "lk9asdn340fk3fvb")
  .get();

这是我的安全规则:

function uidAndProductInDocument() {
    return request.auth.uid in resource.data.users;
}

这是文档内容的样子:

但是,即使此安全规则失败并且不返回任何内容,即使数据库中有应该返回的文档,因为它们与参数匹配。

我不确定如何保护产品关系,因为产品用户的关系在另一个文档中,我在另一个问题中尝试了另一种方法,可以在这里找到: Firestore security rules: get() use in hasAny() list method

我有什么遗漏或需要做些什么才能使此查询正常工作吗?

提前致谢。

【问题讨论】:

  • 请编辑问题以显示此处使用的确切数据。向我们展示 1) 文档的内容,2) 完整的查询,以及 3) 您确定用户已登录。
  • @DougStevenson 我已经为您编辑了问题 - 我确信用户已登录此查询,因为记录 idToken.claims 会导致输出声明。有任何想法吗?感谢您迄今为止的帮助。
  • users 中的那些值看起来不像 Firebase Auth UID。此外,我们看不到 idToken.claims.user_id 中的内容。请编辑问题以显示所有相关数据,根据需要硬编码值,以便我们可以看到所有正在播放的数据。我从未见过有人尝试使用 auth.currentUser.uid 以外的任何东西在查询中指定 UID。
  • @DougStevenson 我已将值硬编码到查询中,但仍然无法正常工作(我为此问题更改了实际的 firebase uid)
  • 您传递给查询的值实际上并不是 Firebase Auth 用户 ID,因此将其与规则中的 request.auth.uid 进行比较是没有意义的。实际的用户 ID 比这长得多。我不知道这个值实际上代表什么或它来自哪里,所以我对如何进行没有任何建议。也许您可以编辑问题以显示您如何填充该数据以及您希望规则实际检查的内容。

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


【解决方案1】:

您应该考虑重组数据以支持您需要的查询。由于 Firestore 无法执行两个包含数组的查询,因此应将其中一个数组转换为对象,其中键是数组的值,字段值只是 true。例如,您可以获取您的用户列表,并为每个用户设置如下所示:

users: {
  xxxx: true
  yyyy: true
}

现在可以这样查询了:

db.collection('Depots')
  .where("products", "array-contains", productId)
  .where(`users.${uid}`, "==", true)
  .get();

你的规则可以这样检查:

return resource.data.users[request.auth.uid]

【讨论】:

  • 谢谢!很长一段时间以来,我一直在试图找出一种方法。将来有没有机会在同一个查询中支持多个数组包含子句?再次感谢您的帮助!
  • 不知道。您可以随时向 Firebase 支持提出功能请求。
  • 索引如何处理这个问题?当我为此创建索引时,它要求我为users.<firebase_id> 创建一个特定的索引,这是否适用于所有条目?再次感谢您的帮助
  • 我认为不会。您可能必须将产品转换为也不使用数组。
  • 当我这样做时,它会让我索引用户。索引users.abc123myidascending。我无法为每个用户编制索引。有谁知道为什么我必须索引,但这个例子不能。
猜你喜欢
  • 2019-11-25
  • 2021-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
  • 2019-07-05
  • 1970-01-01
相关资源
最近更新 更多