我正在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 /)进行更改。
哪种方法更容易编写安全规则?哪一个会有更好的表现?
答案 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