【问题标题】:Firestore write security rule for specific user using auth namesFirestore 使用身份验证名称为特定用户编写安全规则
【发布时间】:2019-02-13 22:33:25
【问题描述】:

Firestore 安全规则的新手,正在尝试理解它。我正在尝试编写一个安全规则,只允许我的集合中的admins 写入数据并且每个人都可以读取它。

admins 的集合具有文档 ID 作为管理员名称,例如“Mary Lane”。在我拥有的文档中:

email: "userMailId@mail.com"
uId: "firestore_user_Id"

uId 是 Firestore 用户 ID 的 ID。要写入的数据是一个对象Message,是:

new Message(uId, title, messageBody, timestamp)

目前我正在尝试将request.auth.uid 与存储在集合中的admins 的ID 匹配:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read;
      allow write: if request.auth.uid == resource.data.uId;
    }
  }
}

这是写的还是我做错了什么。任何帮助表示赞赏。

【问题讨论】:

  • 请编辑您的问题,以更具体地说明“我将管理员和文档 ID 集合作为管理员名称”的含义。如果这些“管理员名称”不属于 Firebase 身份验证用户数据,您将无法完成任务。理想情况下,您希望通过 firebase auth uid 为您的管理数据索引。
  • @DougStevenson 我已经编辑了这个问题。现在可以了吗?
  • 您尚未说明如何在管理员集合中识别管理员。文件编号是什么?如果文档 ID 不是 Firebase 身份验证 UID,那么这可能不起作用。
  • @DougStevenson 再次编辑了问题。我使用文档 ID 作为人名。

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


【解决方案1】:

由于此规则allow write: if request.auth.uid == resource.data.uId; 中没有管理员的姓名,因此无法查找文档以检查他们是管理员。

您需要一个集合,在其中为每个管理员保存一个文档,并将其 UID 作为文档键/名称。一旦你有了它,你可以检查规则中是否存在这样的文档:

allow write: if exists(/databases/$(database)/documents/admins/$(request.auth.uid));

另见documentation on accessing other documents

【讨论】:

  • 谢谢。经过大量搜索文档后,我昨天也想通了,但忙于摆弄它,忘了提供更新。但是因为我想使用一个名字,所以我的最后一条路径是admins/$(request.auth.token.name))。再次感谢。
  • 我不知道令牌中有name 属性。那是用户的displayName 吗?还是自定义声明?
  • 你是认真的问我吗?! :p 如果我错了,请纠正我,这是来自身份验证的显示名称。但是,我还没有彻底测试它。
  • 我查了here,确实是用户的显示名称:“name - 用户的显示名称,如果设置的话。”
  • 真正有用的功能。这就是 firebase 的甜头,你不能直接得到一些特性,但间接地你可以实现你想要的。谢谢@FrankvanPuffelen
猜你喜欢
  • 2021-07-05
  • 2021-07-07
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
相关资源
最近更新 更多