2016-08-16 80 views
0

我一直在使用PostGresSQL作为我的一个应用程序的数据库。为了支持多租户,我为每个租户使用了架构和角色,以限制访问并防止SQL注入时发生数据泄漏。我维护一个连接池,然后在确定租户上下文后执行SET ROLE,以便只能访问他自己的模式。这一切运作良好。但是,mySQL中的等效设计是什么?我看到mySQL没有“角色”,模式/数据库在概念上是相同的,我怎么才能在mySQL中实现类似的功能?我问,因为我正在设计另一个应用程序,并被告知使用mySQL而不是PGSQL。postgres在mySQL中的模式和角色

感谢

回答

1

由于MySQL没有角色的概念,你要么必须使用不同的MySQL数据库用户和数据库,实现数据的同一逻辑分离。实际上,在确定上下文之后,必须使用不同的myswl用户帐户和不同的默认数据库连接到mysql。缺点是这种解决方案会使连接池处于惰性状态。幸运的是,在MySQL中建立到数据库的新连接很快,并且不需要太多资源。

或者,你可以使用一个单一的数据库和MySQL用户账户,用户在应用程序的用户帐户级别区分。显然,这意味着用户的数据不会像现在那样具有相同的逻辑分隔,但仍可以使用连接池。

与用户就可以使用相同的MySQL用户帐户以及默认的数据库连接到MySQL,但存储在不同的数据库只使用单独的MySQL用户帐户访问的实际用户数据的数量有限的第三种选择。但是,在该默认数据库中,为用户数据库中的每个表创建单独的views。在create view语句中,将definer子句设置为可以访问存储表的给定数据库的mysql用户帐户,并将sql安全子句设置为定义者。这样,您仍然可以使用连接池,因为连接是使用通用用户标识创建到默认数据库。客户端数据将在逻辑上在数据库中分开。缺点是,通过默认数据库中的视图,所有数据都可以访问,并且底层数据结构的任何修改都必须反映在视图中。