将单个或多个mysql用户用于具有多租户架构的SaaS PHP / mysql应用程序

时间:2010-07-11 22:58:00

标签: php mysql saas multi-tenant

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

e.g。 mysql user1拥有dbase1。*(database1.alltables)的权限,mysql user2拥有dbase2的权限。*。

我们现在注意到,作为备份转移到另一台服务器已经很痛苦了(我们不使用复制但尝试偶尔转储文件但是不能删除info_schema dbase并从sql重新创建文件似乎。

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

你有什么想法?

2 个答案:

答案 0 :(得分:3)

您可能想要做的是,在创建MySQL用户时,还将该用户创建的记录存储在其他位置(在DB之外),然后使用脚本将用户及其权限还原到来自您创建的记录的数据库。

答案 1 :(得分:0)

这在某种程度上取决于您的要求(特别是与从备份中还原客户端有关),但是我为我的所有租户使用了一个数据库/架构,但没有租户看到其他租户的数据的可能性。

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

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

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