Firebase Firestore使用身份验证名称为特定用户写入安全规则

Firebase Firestore使用身份验证名称为特定用户写入安全规则,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,Firestore安全规则新手,正在尝试理解它。我正在尝试编写一个安全规则,只允许集合中的管理员写入数据,而每个人都可以读取数据 管理员的集合将文档ID作为管理员名称,例如,“Mary Lane”。在文档中,我有以下字段: email: "userMailId@mail.com" uId: "firestore_user_Id" uId是Firestore用户id的id。要写入的数据是对象消息,是: new Message(uId, title, messageBody, timestamp)

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

管理员的集合
将文档ID作为管理员名称,例如,“Mary Lane”。在文档中,我有以下字段:

email: "userMailId@mail.com"
uId: "firestore_user_Id"
uId
是Firestore用户id的id。要写入的数据是对象
消息
,是:

new Message(uId, title, messageBody, timestamp)
当前,我正在尝试将
request.auth.uid
与存储在集合中的
管理员的id匹配:

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

这是我写的还是我做错了什么。非常感谢您的帮助。

因为管理员的名字在此规则中不可用
允许写入:if request.auth.uid==resource.data.uid,无法查找文档以检查它。他们是管理员

您将需要一个集合,在其中为每个管理员保留一个文档,其UID作为文档键/名称。一旦您拥有该文档,您可以通过以下方式检查规则中是否存在此类文档:

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

另请参见。

,因为管理员的名称在此规则中不可用
允许写入:if request.auth.uid==resource.data.uid,无法查找文档以检查它。他们是管理员

您将需要一个集合,在其中为每个管理员保留一个文档,其UID作为文档键/名称。一旦您拥有该文档,您可以通过以下方式检查规则中是否存在此类文档:

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

另请参见。

请编辑您的问题,以便更具体地了解“我将管理员和文档ID集合作为管理员名称”的含义。如果这些“管理员名称”不是Firebase auth用户数据的一部分,您将无法完成任务。最理想的情况是,您希望您的管理数据索引为firebase auth uid。@DougStevenson我已经编辑了这个问题。现在可以了吗?您还没有说明如何在管理员集合中识别管理员。文档id是什么?如果文档ID不是Firebase身份验证UID,那么这可能不起作用。@DougStevenson再次编辑了这个问题。我正在使用文档id作为此人的姓名。请编辑您的问题,以便更具体地了解“我有管理员和文档id集合作为管理员姓名”的含义。如果这些“管理员名称”不是Firebase auth用户数据的一部分,您将无法完成任务。最理想的情况是,您希望您的管理数据索引为firebase auth uid。@DougStevenson我已经编辑了这个问题。现在可以了吗?您还没有说明如何在管理员集合中识别管理员。文档id是什么?如果文档ID不是Firebase身份验证UID,那么这可能不起作用。@DougStevenson再次编辑了这个问题。我正在使用文档id作为此人的姓名。谢谢。在搜索了很多文档之后,我昨天也找到了答案,但是我忙着摆弄它,忘记了更新。但是由于我想使用一个名称,我的最后一个路径是
admins/$(request.auth.token.name))
。再次感谢。我不知道令牌中有
名称
属性。这是用户的
displayName
?或者这是一个定制声明?你真的在问我p如果我错了,请纠正我,这是来自授权的显示名称。然而,我还没有对它进行彻底的测试。我查了一下,它确实是用户的显示名:“name-用户的显示名,如果设置了的话。”这些功能非常有用。这就是firebase的甜美之处,你无法直接获得某些功能,但可以间接实现你想要的功能。谢谢@FrankvanPuffelenThank谢谢你。在搜索了很多文档之后,我昨天也找到了答案,但是我忙着摆弄它,忘记了更新。但是由于我想使用一个名称,我的最后一个路径是
admins/$(request.auth.token.name))
。再次感谢。我不知道令牌中有
名称
属性。这是用户的
displayName
?或者这是一个定制声明?你真的在问我p如果我错了,请纠正我,这是来自授权的显示名称。然而,我还没有对它进行彻底的测试。我查了一下,它确实是用户的显示名:“name-用户的显示名,如果设置了的话。”这些功能非常有用。这就是firebase的甜美之处,你无法直接获得某些功能,但可以间接实现你想要的功能。谢谢@FrankvanPuffelen