Firebase组织文档的成员资格

时间:2019-07-08 23:21:27

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

我正在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 /)进行更改。

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

1 个答案:

答案 0 :(得分:2)

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

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

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