5

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

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

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

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

你怎么认为?

4

2 回答 2

3

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

于 2010-07-11T23:01:39.970 回答
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/

于 2018-08-23T17:47:25.167 回答