【问题标题】:Firestore rule on uid doesn't work for unknown reasonuid 上的 Firestore 规则因未知原因而不起作用
【发布时间】:2020-04-14 11:27:21
【问题描述】:

我的文档中有一个“所有者”字段,仅授权所有者阅读该文档,并且只能写入其“所有者”字段是用户的 uid 的新文档:

allow read: if request.auth.uid == resource.data.owner; allow create, write : if request.auth.uid == request.resource.data.owner;

创建和更新规则按预期工作!我测试了一下,如果新数据中记录的'owner'字段不是用户的UID那就不行!

问题在于“读取”部分。我无法阅读记录。只有当我更改为allow read: request.auth.uid != null 时,我才能阅读。 我三次检查记录是否有一个与 UID 完全相同的“所有者”字段,也在调试中。

我有使用 Firebase 的经验,但我不知道这里有什么问题。

【问题讨论】:

  • “我无法读取记录。” -> 能否请您出示用于阅读文档的代码?

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


【解决方案1】:

由于您指出“[您无法] 读取记录s”(记录处带有 S),因此您的问题很可能来自以下事实安全规则不是过滤器,如documentation 中所述:

一旦您保护了您的数据并开始编写查询,请记住 安全规则不是过滤器。 您不能为所有人编写查询 集合中的文档并期望 Cloud Firestore 返回 仅限当前客户有权访问的文档

您没有显示用于读取 Firestore 文档的查询,但让我们假设您的文档位于名为 collection 的集合中。

使用类似的查询

query = db.collection("collection")
query.get().then(....);

您正在独立于用户 ID 进行查询,因此存在问题。

您需要使用where() 方法调整您的查询,如下所示:

//get the value of uid
query = db.collection("cities").where("owner", "==", uid)
query.get().then(....)

【讨论】:

  • 伟大的观察...这是我的错误假设。我取消了客户端的过滤器来测试它,并假设规则会过滤结果!好收获!
猜你喜欢
  • 2012-08-30
  • 2019-03-11
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
相关资源
最近更新 更多