具有多个业务实体的Firestore、Firebase身份验证和Firestore规则

具有多个业务实体的Firestore、Firebase身份验证和Firestore规则,firebase,google-cloud-firestore,firebase-authentication,firebase-security,Firebase,Google Cloud Firestore,Firebase Authentication,Firebase Security,我想看看Firestore是否适合我的需要 为了可扩展性和安全性,我正在使用Firestore设计一个多租户系统。仅使用Firestore、Firebase身份验证和Firebase规则来处理所有CRUD操作,是否可以正确地做到这一点?实体背后的理念是: System > Account > Business > Customer 每个实体级别的角色包括: Administrator, Manager, Support, Report, Unauthenticated (th

我想看看Firestore是否适合我的需要

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

System > Account > Business > Customer
每个实体级别的角色包括:

Administrator, Manager, Support, Report, Unauthenticated (the customer)
账户有业务,业务有客户。客户不需要进行身份验证,而是阅读特定文档(由业务部门指定),然后创建自己的特定新文档。他们可以创建多个文档,但会有基于时间的卷阈值(没有DOS!)

我相信,如果Firestore没有将帐户作为拥有多个业务的超集,那么Firestore规则将非常有效

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


提前感谢您的洞察力

有了一套定义良好的系统,您确实可以将Firestore用于这种多租户系统

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

你尤其应该:

  • 检查用户是否具有正确的声明,例如
    auth.token.businessId==“xyz”
    auth.token.role==“Support”
  • 检查用户是否正在写入/读取与其实体对应的文档,例如
    allow create:if request.auth.uid==userId&&request.resource.data.businessId==auth.token.businessId
  • 不要忘记,因此在用户执行的每个查询中,您需要添加来自他/她的自定义声明的不同ID(
    businessId
    accountId
    ,等等)。通过使用(子)集合模拟实体树,或者在查询中使用一些
    where()
    子句


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



    您可能需要为每个用户(角色、帐户、业务等)管理一组声明,这可能会变得复杂,因此您可能会对下面的文章感兴趣,这篇文章解释了如何使用这些声明。

    有了一组定义良好的声明,您确实可以将Firestore用于这样的多租户系统

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

    你尤其应该:

  • 检查用户是否具有正确的声明,例如
    auth.token.businessId==“xyz”
    auth.token.role==“Support”
  • 检查用户是否正在写入/读取与其实体对应的文档,例如
    allow create:if request.auth.uid==userId&&request.resource.data.businessId==auth.token.businessId
  • 不要忘记,因此在用户执行的每个查询中,您需要添加来自他/她的自定义声明的不同ID(
    businessId
    accountId
    ,等等)。通过使用(子)集合模拟实体树,或者在查询中使用一些
    where()
    子句


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



    您可能需要为每个用户(角色、帐户、业务等)管理一组声明,这可能会变得很复杂,因此您可能会对下面的文章感兴趣,这篇文章解释了如何进行声明。

    如果我理解的话,这将要求在每个文档上都有业务ID,作为授权过程的一部分?是吗?是的,除非所有具有帐户授权的用户都可以读/写此帐户中的业务。很难准确回答,因为我们不知道您的安全性是如何应用于您的树结构的。但根据经验,您应该在给定的文档中包含一个或多个字段,这些字段对应于用户的声明。谢谢Renaud。与关系数据库相比,文档的安全性对我来说无疑是一种思维转移。我很感谢你的帮助。如果我理解的话,那就需要在每个文档上都有业务ID,作为授权流程的一部分?是吗?是的,除非所有具有帐户授权的用户都可以读/写此帐户中的业务。很难准确回答,因为我们不知道您的安全性是如何应用于您的树结构的。但根据经验,您应该在给定的文档中包含一个或多个字段,这些字段对应于用户的声明。谢谢Renaud。与关系数据库相比,文档的安全性对我来说无疑是一种思维转移。我感谢你的帮助。