【发布时间】:2018-08-17 10:24:01
【问题描述】:
- 目前我们没有使用任何子集合
- 用户拥有他们所属公司的列表
- 每个项目仅与 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)
}
但是根据文档,这意味着每次读取基本上需要 3 次读取(2 次安全查询和 1 次从数据库中实际读取)。这似乎是在浪费查询。
还有比这更好的方法吗? 我们正在考虑改为子集合:
- 最后,我们将在根集合中拥有“公司”和“用户”(用于存储所有用户详细信息)
- 项目将是公司的子集合
- 页面将是项目的子集合
- ...等
- 并且公司将包含用户列表(而不是像现在这样相反) - 但只有列表,而不是用户详细信息
这样我们可以使用与文档类似的方法,其中每个匹配项都包含 {companyId} 并且在允许语句中我们将使用类似
match /databases/{database}/documents/companies/{companyId}/projects/{projectId} {
allow read: if
exists(/databases/$(database)/documents/companies/$(companyId)/users/$(request.auth.uid));
}
感谢您就如何以最可扩展且尤其是最安全的方式构建它的任何建议。
【问题讨论】:
标签: firebase google-cloud-firestore firebase-security