【发布时间】:2020-03-27 20:00:45
【问题描述】:
我目前在一个文档中有两个数组,一个代表产品 ID,另一个代表用户 ID。在我的查询中,我需要查询两个数组以确保 firestore 安全规则正常工作,但为此,我尝试在同一个查询中使用 array-contains 和 in,这在文档中是可以接受的,但是当我去查询,我得到“权限缺失或不足”。
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