Firestore-公司内用户的安全规则

Tun*_*erx 2 firebase google-cloud-firestore firebase-security-rules

我们当前的Firestore结构如下: 在此处输入图片说明

  • 目前,我们没有使用任何子集合
  • 用户具有他们所属公司的列表
  • 每个项目仅与1家公司关联
  • 项目属于公司,当在companyId字段中写入公司UID时

我的第一个问题是如何指定该数据库定义的安全规则?有一些最佳实践方法吗?

我们的第一个想法是这样做:

match /databases/{database}/documents/projects/{projectUid}/{document=**} {
allow read: if 
(/databases/$(database)/documents/projects/$(projectUid)/companyId) === 
(/databases/$(database)/documents/users/$(request.auth.uid)/companyId)
}
Run Code Online (Sandbox Code Playgroud)

但是根据文档,这意味着我们每个读取基本上需要3个读取(2个安全性查询和1个从DB实际读取)。这似乎是对查询的浪费。

有没有比这更好的方法了?我们正在考虑更改子集合:

  • 最后,我们将在根集合“ companies”和“ users”中存储所有用户的详细信息
  • 项目将是公司的子集合
  • 页面将是项目的子集合
  • ...等等
  • 并且公司将包含用户列表(而不是像现在这样)-但仅包含列表,而不包含用户详细信息

这样,我们可以使用与文档中类似的方法,其中每个匹配项都包含{companyId},在allow语句中,我们将使用类似

match /databases/{database}/documents/companies/{companyId}/projects/{projectId} {
    allow read: if
    exists(/databases/$(database)/documents/companies/$(companyId)/users/$(request.auth.uid));
}
Run Code Online (Sandbox Code Playgroud)

感谢您提供有关如何以最可扩展且最安全的方式构建它的任何建议。

Fra*_*len 5

您是否考虑过将用户的公司ID添加为对其个人资料的自定义声明?这样,您的安全规则中就不需要其他读取。

由于设置这些声明需要Admin SDK,因此它将要求您可以在某个地方运行受信任的代码。但是,如果您还没有自己的受信任环境,则可以为此使用Cloud Functions,例如,基于一些其他操作,例如写入当前Firestore结构。