【问题标题】:Use single or mulitple mysql users for SaaS PHP/mysql application with multi-tenant architecture为多租户架构的 SaaS PHP/mysql 应用程序使用单个或多个 mysql 用户
【发布时间】:2011-03-14 14:08:24
【问题描述】:

我们正在构建一个多用户应用,每个客户都有一个数据库。所有客户数据库结构都是相同的。现在我们正在生成一个新的 mysql 用户(每个客户端),它只有在自己的数据库上工作的权限。

例如mysql user1对dbase1.*(database1.alltables)有权限,mysql user2对dbase2.*有权限。

我们现在注意到,作为备份转储到另一台服务器已经很痛苦(我们不使用复制,但尝试偶尔转储文件,但不能从 sql 文件中删除和重新创建 information_schema 数据库好像。

无论如何,我们想知道是否只使用 1 个可以访问所有客户端数据库的用户会更好?这更不安全吧?还是可以以一种相当安全的方式使用它?肯定会更好管理。

你有什么想法?

【问题讨论】:

    标签: php mysql saas multi-tenant


    【解决方案1】:

    您可能想要做的是,在为 MySQL 用户创建时,还将该用户的创建记录存储在其他地方(数据库之外),然后有一个脚本将用户及其权限恢复到来自您创建的记录的数据库。

    【讨论】:

    • 谢谢,这是一个很好的提示,但我们仍然需要管理所有这些用户帐户。有没有办法用一个帐户做到这一点并且仍然保证安全?
    • 嗯,多用户帐户的优势在于它为您提供了另一层隔离 - 如果由于某种原因执行了 SQL 注入,它最多可以接触到单个客户的数据。除此之外,理论上您可以为数据库编写自己的封装层,强制仅访问当前客户的数据库,这将为您带来类似的好处;你只是相信你的编码而不是 MySQL 团队的。
    【解决方案2】:

    这在一定程度上取决于您的要求(尤其是与从备份中恢复客户端相关),但我为所有租户使用单个数据库/架构,租户没有可能看到另一个租户的数据。

    1. 为每个租户创建一个 mysql 用户(听起来你已经有了)
    2. 向所有表添加一个tenant_id 列(VARCHAR)
    3. 使用触发器自动将当前mysql用户放入INSERT上的tenant_id列
    4. 为每个表创建一个视图,该视图仅显示租户 ID = current_mysql_user 的行(不要在这些视图中包含租户 ID)
    5. 仅将这些视图的访问权限授予租户 mysql 用户
    6. 确定正在连接的租户(可能通过 URL)以确定应使用哪个 mysql 用户连接到数据库。

    由于您的应用程序将使用特定于租户的用户连接到数据库,该用户只能访问其中tenant_id = 其用户的行,因此数据将按租户分段。

    我能够使用这种技术在一个周末将大型单租户应用程序转换为多租户应用程序,而只需进行很少的更改。我在我的博客中记录了完整的解决方案:https://opensource.io/it/mysql-multi-tenant/

    【讨论】:

      猜你喜欢
      • 2023-01-28
      • 1970-01-01
      • 2014-07-27
      • 2012-07-24
      • 2014-01-26
      • 1970-01-01
      • 2012-05-17
      • 2012-04-10
      • 2020-10-11
      相关资源
      最近更新 更多