【问题标题】:multi tenancy structure with node and sequelize具有节点和续集的多租户结构
【发布时间】:2022-03-22 11:52:56
【问题描述】:

我正在计划一个带有 nodejs 和 sequelize(mysql 方言)的多租户应用程序。我将为每个客户提供一个应用程序和多个数据库。我需要在身份验证后连接到客户端数据库(使用 passport.js)。所以有一个经典的主数据库,其中包含客户端信息和数据库用户、主机和密码,然后在成功登录后,应用程序连接到特定的客户端数据库。我怎么能做这样的事情?我正在考虑使用会话...也许是一个中间件,它为每个请求获取会话然后将数据传递给 sequelize 配置对象?谁能与我分享他/她如何设法做类似的事情?我陷入了一个逻辑陷阱!谢谢

【问题讨论】:

    标签: mysql node.js sequelize.js multi-tenant


    【解决方案1】:

    你很亲密。

    当您在主数据库中查找用户时,为了验证用户名/密码,您还将查找到用户特定数据库的连接字符串。然后你可以创建一个简单的 express 中间件函数,在每个请求开始时打开特定的连接。

    您将需要数据库的用户名和密码。为获得最佳安全性,它们不应与用户的用户名和密码相同:如果有人破解了您的 Web 应用程序和用户表,您不希望他们拥有所有密码。

    但是,您提出的不是经典的多租户。多租户正在创建一个单一的数据库,其中的各个表都有列,说明它们是为哪个用户服务的。然后,一旦护照告诉您用户的 id,您就可以将其放入查询中(例如,SELECT .... WHERE user_id = <<value>> AND ...

    您的提案对于几十个用户来说效果还算不错。但是如果你有数以万计的用户会发生什么?那将是很多独立的数据库。

    【讨论】:

    • 我和 O. Jones 在一起。如果您为每个客户端创建 N 个表,您很快就会得到一堆无法维护的表。我见过一些公司这样做,他们花了数年时间痛苦地试图撤销这个决定。使用这种方法,如果您遇到扩展问题,请查看分区或分片。
    • 这正是我最初的打算,但我认为保留单独的数据库会更好地提高性能和安全性,甚至可能会发生灾难:保留单个数据库(经典多租户)会更糟安全条款? (如果有人破解了数据库,他们可以删除每个租户的所有数据)。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多