Firebase组织文档的成员资格

Firebase组织文档的成员资格,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,我正在Firebase中创建一个应用程序,需要确保用户只能读/写属于其团队的文档/集合。我的问题基本上是我应该如何构造成员数据。具体来说,我考虑了一个想法: /teams/{teamid} { displayName: "Company X Team", owner: "userid", members: ["email1", "email2", "email3"] } /teams/{teamid}/projects/{projectid} { name: "My

我正在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"
}
我是否应该将“members”作为数组存储为/teams/document的一部分(如上面的代码示例所示)?或者我应该像/projects/一样将其存储为自己的文档集合吗

我主要关心的是我什么时候去写安全规则。我希望确保只允许所有者或成员对/teams/及其子集合(如:/projects/)进行更改


哪种方式更容易编写安全规则?哪一个性能更好

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

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


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

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


在构建数据结构之前,您需要考虑如何查询数据。这是最重要的。如果不先知道查询,结构将来可能会有问题。这是非常正确的。当我决定问这个问题时,我正在提出一个问题。具体地说,我想要一个查询,可以搜索/teams/,并告诉我授权用户是否被邀请参与其中。在构建数据之前,您需要考虑如何查询数据。这是最重要的。如果不先知道查询,结构将来可能会有问题。这是非常正确的。当我决定问这个问题时,我正在提出一个问题。具体来说,我想要一个查询,可以搜索/teams/并告诉我授权用户是否被邀请加入其中。我喜欢这样。然而,现在我想起来了,也许我会两者兼而有之。我将在/teams/document上保留一个数组,称之为“invests”,并存储电子邮件地址。在此人第一次通过身份验证之前,我不会拥有“uid”。这意味着我需要一条规则,比如说:“除非邀请中包含您的auth.email,否则您不能将自己添加到/members/。这听起来合理吗?@scotteditrich听起来合理。存储电子邮件的另一种方法是创建另一个名为“email\u invests”的子集合“其中每个文档ID都是一个电子邮件地址。我更喜欢这种方法,因为这样更容易添加/删除邀请。另外,如果您希望在每个电子邮件邀请中附加一些元数据(如过期日期),那么如果每个电子邮件邀请都是一个文档,那么就更容易完成。我喜欢这样。然而,现在我想起来了,也许我会两者兼而有之。我将在/teams/document上保留一个数组,称之为“invests”,并存储电子邮件地址。在此人第一次通过身份验证之前,我不会拥有“uid”。这意味着我需要一条规则,比如说:“除非邀请中包含您的auth.email,否则您不能将自己添加到/members/。这听起来合理吗?@scotteditrich听起来合理。存储电子邮件的另一种方法是创建另一个名为“email\u invests”的子集合“其中每个文档ID都是一个电子邮件地址。我更喜欢这种方法,因为这样更容易添加/删除邀请。此外,如果您希望将一些元数据附加到每个电子邮件邀请(如过期日期),那么如果每个电子邮件邀请都是一个文档,则更容易实现。
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))

}