【问题标题】:Firestore, Firebase Authentication, and Firestore Rules with multiple business entitiesFirestore、Firebase 身份验证和具有多个业务实体的 Firestore 规则
【发布时间】:2021-05-27 19:05:55
【问题描述】:

我正在尝试查看 Firestore 是否适合我的需求。

我正在使用 Firestore 设计一个多租户系统,以实现可扩展性和安全性。这可以仅使用 Firestore、Firebase 身份验证和 Firebase 规则来处理所有 CRUD 操作吗?实体背后的理念是:

System > Account > Business > Customer

每个实体级别的角色是:

Administrator, Manager, Support, Report, Unauthenticated (the customer)

帐户有企业,企业有客户。客户无需进行身份验证,而是阅读特定文档(由企业指定),然后创建自己的特定新文档。他们可以创建多个文档,但会有基于时间的卷阈值(没有 DOS!)。

我相信,如果 Firestore 规则没有将帐户作为具有多个企业的超集,它会很好用。

是否可以仅使用 Firestore、身份验证和规则来创建这样的系统?我想保持简单,但也不想用钳子敲钉子。

提前感谢您的洞察力!

【问题讨论】:

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


    【解决方案1】:

    通过一组定义明确的Custom Claims,您确实可以将 Firestore 用于这样的多租户系统。

    在您的安全规则中,您可以根据访问角色组合不同的声明。

    您尤其应该:

    1. 检查用户是否有正确的声明,例如auth.token.businessId == "xyz", auth.token.role == "Support"
    2. 检查用户是否正在编写/阅读与其实体相对应的文档,例如allow create: if request.auth.uid == userId && request.resource.data.businessId == auth.token.businessId

    不要忘记Security Rules are not filters,因此在用户执行的每个查询中,您需要从他/她的自定义声明中添加不同的 ID(businessIdaccountId 等...)。通过使用(子)集合来模仿实体树,或者在查询中使用一些 where() 子句。


    请注意,由于客户不需要进行身份验证,因此如果他们拥有其他企业的 ID(即DocumentReferences),他们可能会从其他企业读取和创建文档。


    您可能必须为每个用户(角色、帐户、业务...)管理一组声明,这可能会变得很复杂,因此您可能会对以下解释如何 create an Admin module for managing Firebase users access and roles 的文章感兴趣。

    【讨论】:

    • 如果我理解的话,那将需要在每个文档上都有业务 ID 作为授权过程的一部分?对吗?
    • 可以,除非所有有账号授权的用户都可以读/写这个账号下的业务。很难准确回答,因为我们不知道您的安全性如何应用于您的树形结构。但根据经验,您应该在给定的文档中包含一个或多个与用户声明相对应的字段。
    • 谢谢雷诺。与关系数据库相比,文档的安全性对我来说绝对是一种转变。感谢您的帮助。
    猜你喜欢
    • 2021-01-16
    • 2019-07-15
    • 2021-07-23
    • 2021-05-22
    • 2021-05-29
    • 2019-08-13
    • 1970-01-01
    • 2018-05-02
    相关资源
    最近更新 更多