【问题标题】:Is a multi-tenancy setup feasible with Firebase and Firestore?Firebase 和 Firestore 的多租户设置是否可行?
【发布时间】:2019-06-06 14:32:35
【问题描述】:

我正在考虑使用 Firebase 和 Firestore 创建多租户应用。租户的数量会很少(最初大约 6 个),最终用户不会在应用程序上创建自己的实例,而是由管理员严格控制。

我的理想情况是只有一个应用程序,我可以将多个域附加到,并将请求路由到特定数据库以实现它们。

我有几个担忧:

我在文档中阅读了我可以为每个应用创建多个数据库,但在我的管理面板中看不到选项,所以我不确定文档目前是否不正确(或者它是否指的是 Realtime DB )。

我不希望注册的用户注册到所有租户,并且考虑到 Firebase 身份验证的工作方式,我看不到任何可以指定用户注册到哪个域的方法。我曾想过在一个跟踪用户所属域的集合中管理它,并假装它看起来使用户处于孤立状态,但是如果用户在“两个”租户中注册,并想更改他们的登录名凭据,这将在整个网络中更改它们,并且可能会令人困惑。

所以这听起来不像我想要的那样干净,这将指向选项 2:

拥有一个前端应用程序,该应用程序引用了它可以连接的所有 Firebase 应用程序,并联系不同应用程序的后端以保持数据和用户身份验证的分离。这将解决孤立的用户问题,但随后我将在后端维护几个不同的应用程序,制作该产品的新版本的全部目的是避免维护多个相似但略有不同的代码库。 那个问题的解决方案是从相同的代码仓库部署到 firebase 上的不同应用程序:CLI 是否允许我每次都选择我的部署目标?

我想选项 3 是让一个无头 React 应用程序联系节点服务器或其他东西,但是我会失去所有酷的 Firebase 优点,我真的在挖掘 Firebase。

这是一个可以解决的问题吗?还是我想把方钉塞进圆孔?

谢谢!

【问题讨论】:

    标签: firebase google-cloud-firestore


    【解决方案1】:

    我意识到这个问题在这一点上有点老了,但我也在调查同样的问题。我也只关注少数租户。

    据我了解,我正在研究支持多租户身份验证并原生支持 Firebase 的 Google 身份平台。 Firebase SDK 支持选择租户,您可以设置安全规则以根据用户的租户 ID 锁定数据库的各个部分。

    https://cloud.google.com/identity-platform/docs/multi-tenancy-quickstart

    我认为关键是您的 Firestore 结构,因此您将拥有每个租户的顶级集合,以及您想要共享的任何内容。

    {
        shared: {},
        tenant1: {
            users: {},
            settings: {},
            data: {},
        },
        tenant2: {
            users: {},
            settings: {},
            data: {},
        },
        // tenant3, 4, 5, etc
    }
    

    他们的文档中的 Firebase SDK 示例,用于在您的应用中切换租户。如果您查看该链接,还有一个示例,其中有多个应用引用,每个引用分配了不同的租户。

    // One Auth instance
    // Switch to tenant1
    firebase.auth().tenantId = 'tenant1';
    // Switch to tenant2
    firebase.auth().tenantId = 'tenant2';
    // Switch back to project level IdPs
    firebase.auth().tenantId = null;
    

    这里的这个问题还讨论了在您的 Firestore 安全规则中使用具有 request.auth.token.firebase.tenant 值的租户:

    https://stackoverflow.com/a/65708678/8417852

    【讨论】:

      【解决方案2】:

      我的团队最近解决了一个类似的情况,我们需要使用 Firebase 跨多个租户部署单个 Angular 应用。

      我们提出的解决方案与您的第二个选项非常相似:

      1. 在 Firebase 控制台上创建单独的 Firebase 项目,为您计划支持的每个租户创建一个。
      2. 安装 CLI 并在有权访问您刚刚创建的每个项目的帐户下登录后,在您的根目录中添加一个 .firebaserc 来为每个新创建的项目设置别名。这看起来像:
      {
        "projects": {
          "dev": "my-dev-project-id",
          "tenant1": "my-tenant1-project-id",
          "tenant2": "my-tenant2-project-id"
        }
      }
      
      1. 您现在可以通过以下方式在本地提供连接您的开发 Firebase 项目的代码: firebase serve -P dev 并通过以下方式部署特定项目:firebase serve -P dev。默认情况下,这会将您的项目部署到 Firebase 托管并部署您创建的任何相关云功能,但您可以轻松 customize this behavior
      2. 要一次部署所有项目,请设置一个简单的./deploy-all.sh 脚本来迭代项目并替换每个别名。您还可以自定义它以在部署每个项目之前运行 linting/instillation 等。
      3. Firebase 托管将 automatically host 每个域在 your-app.firebaseapp.comyour-app.web.app。您也可以customize the subdomains 每个项目映射到。

      注意事项: 上述方法依赖租户 URL 将项目数据库映射到用户信息。在移动设备上,这种方法变得稍微复杂一些。我们让用户在移动设备上输入一个动态映射到 Firebase 配置的密钥,但可能有更好的方法来解决这个问题。

      【讨论】:

      • 请记住,您可以创建的项目数量有(可变)限制stackoverflow.com/questions/41485736/…
      • 显然,Blaze 计划“大幅”增加了 5-10 个项目配额(这意味着)。另请注意,Firebase 功能将于 2020 年 2 月免费使用。
      猜你喜欢
      • 1970-01-01
      • 2019-09-18
      • 2018-03-28
      • 2018-08-09
      • 1970-01-01
      • 2020-11-27
      • 1970-01-01
      • 2013-05-06
      相关资源
      最近更新 更多