如何限制多租户 MySQL 数据库?

And*_*ith 4 mysql

我有下表:

Create table `webservice`(  
  `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT,
  `hostname` text NOT NULL,
  `portalid` int NOT NULL,
  `serviceid` int NOT NULL,
  `customerid` int,
  primary key (`id`)
)
Run Code Online (Sandbox Code Playgroud)

我有多个客户使用不同的 FQDN 但相同的 DOCROOT 和 MySQL 登录访问多个门户和服务。它是多租户应用程序。

现在我希望每个访问者只能查看他有权查看的数据。所有这些用户都使用单个 MySQL 连接登录。

在第一次连接时,浏览器正在请求 FQDN,因此它应该授予查看关联的“portalid”行的权限。因此,在不知道 FQDN 的情况下,无法访问具有不同 portalid 的

当用户登录时,他的视图应该被限制为只有他自己的customerid 的记录。

我不知道该怎么做,但我想我可以在 SQL 中使用会话数据,这将允许获取所需的数据。但是我目前不知道如何设置。

我有这样的会话:https : //security.stackexchange.com/questions/17318/how-to-secure-mysql-based-web-session-data-table

小智 5

最简单的答案可能是:给每个门户一个不同的 MySQL 数据库,使用不同的登录名和密码。

下一个最简单的答案是:将每个门户的内容放在一个单独的表中。仔细检查您的代码以确保每个门户只能访问自己表中的数据。

如果您不想更改数据库架构,实用的答案是:当门户应用程序的代码设置 MySQL 连接时,它应该做的第一件事就是创建一个视图。定义视图,使其仅提供对与该特定门户关联的数据子集的访问。您可以使用带有表单的 WHERE 子句的 SQL 语句定义视图WHERE portalid = xxx(将 xxx 替换为当前运行的门户的 ID)。例如,

CREATE VIEW webserviceview
AS
SELECT *
FROM webservice
WHERE portalid = xxx
Run Code Online (Sandbox Code Playgroud)

(用当前运行的门户填写xxx)。现在确保您的所有代码只访问webserviceview而不webservice直接访问表。

当用户登录时,您可以使用相同的想法进一步限制访问。创建一个仅包含当前登录用户数据的视图。例如,

CREATE VIEW currentuser
AS
SELECT *
FROM webserviceview
WHERE customerid = yyy
Run Code Online (Sandbox Code Playgroud)

然后确保您的代码只访问该currentuser表,而不是webserviceorwebserviceview表。

如果您想阅读一些将这种想法更进一步的研究论文,请查看以下论文: