【问题标题】:Firebase Organizing Membership to a DocumentFirebase 组织文档的成员身份
【发布时间】:2019-07-08 23:21:27
【问题描述】:

我正在 Firebase 中创建一个应用程序,该应用程序需要确保用户只能读取/写入属于其团队的文档/集合。我的问题基本上是我应该如何构建会员数据。具体来说,这是我正在考虑的一个想法:

/teams/{teamid}
{
   displayName: "Company X Team",
   owner: "userid",
   members: ["email1", "email2", "email3"]
}

/teams/{teamid}/projects/{projectid}
{
    name: "My Project"
    otherProps: "Other Properties"
}

/users/{userid}
{
    displayName: "John Doe",
    email: "john.doe@somedomain.com"
}

我是否应该将“成员”作为数组存储为 /teams/ 文档的一部分(如上面的代码示例所示)?还是应该将其存储为自己的文档集合,就像 /projects/ 一样?

我主要关心的是何时去编写安全规则。我想确保只允许所有者或成员更改 /teams/ 及其子集合(例如:/projects/)。

哪种方式更容易编写安全规则?哪一个会有更好的表现?

【问题讨论】:

  • 在构建数据之前,您需要考虑如何查询数据。这是最重要的。如果不先了解查询,则该结构将来可能会出现问题。
  • 这是非常正确的。当我决定问这个问题时,我正在制定一个查询。具体来说,我想要一个可以搜索 /teams/ 的查询,并告诉我是否邀请了经过身份验证的用户。

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


【解决方案1】:

我会将成员构造为子集合而不是数组。将每个子集合成员的文档 ID 设为用户 ID。

然后,您可以编写一个简单的 exists() 安全规则。这还允许您存储有关成员资格的其他数据(一些成员是管理员,他们何时加入等)。

match /teams/{teamid}/projects/{projectid} {
      // Make sure a 'user' is a member of the team 
      allow write: if exists(/databases/$(database)/documents/teams/${teamid}/members/$(request.auth.uid))

}

https://firebase.google.com/docs/firestore/security/rules-conditions#access_other_documents

【讨论】:

  • 我喜欢这样。但是,现在我想起来了,也许我会两者兼而有之。我将在 /teams/ 文档中保留一个数组,并将其称为“邀请”并存储电子邮件地址。在此人第一次进行身份验证之前,我不会拥有“uid”。这意味着我需要一条这样的规则:“除非您的 auth.email 在邀请中,否则您不能将自己添加到 /members/。这听起来合理吗?
  • @ScottDietrich 听起来很合理。存储电子邮件的另一种方法是创建另一个名为“email_invites”的子集合,其中每个文档 ID 都是一个电子邮件地址。我更喜欢这种方法,因为这样添加/删除邀请会更容易。此外,如果您希望在每个电子邮件邀请中附加一些元数据(例如到期日期),如果每个电子邮件邀请都是一个文档,则更容易完成。
猜你喜欢
  • 2022-08-18
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 2016-10-26
相关资源
最近更新 更多