我试图想出一个好的,安全的方法,让一个文件目录(我们的应用程序的一个实例)从一系列多种可能性中连接到一个数据库。我们以前做事的方式是每个客户都有一组文件和一个数据库,他们的文件集将被配置为直接链接到他们的数据库。这是有效的,但是它使得难以在所有客户中保持应用程序的标准化版本;确保每个人都有最新的更新。
我想解决的一个方法是拥有一个独特的通用数据库,用于登录过程。在该数据库中将是包含用户特定数据库的名称的字段,该数据库随后将存储在其会话中。一旦他们登录了应用程序,就会查看会话以获取其数据库的名称,并直接连接到该数据库。
我很确定这种方法可行,我只是担心它可能会出现一些安全问题。关于如何处理这个的任何建议?
答案 0 :(得分:1)
每个客户唯一需要知道的是数据库连接的user,pass,dbname和hostname。我只是将它们存储在一个配置文件中,每个客户一个,根据客户命名:
/path/to/configs/customer1.ini
/path/to/configs/customer2.ini
/path/to/configs/customer3.ini
然后,您的应用会根据VHOST中设置的环境变量或$ _SERVER ['HTTP_HOST']中的值选择要加载的配置文件。
例如,您的index.php可能包含:
if (!preg_match('/pattern to ensure valid hostname/', $_SERVER['HTTP_HOST'])) {
header('HTTP/1.1 403 Forbidden');
exit;
}
$config = '/path/to/configs/' . $_SERVER['HTTP_HOST'] . '.ini';
if (!file_exists($config)) {
header('HTTP/1.1 404 Not Found');
exit;
}
require_once $config;
然后创建:
/path/to/configs/customer.com.ini
为:
dbname = whatever
user = whatever
pass = whatever
dbhost = whatever
(呃,对不起,你不会要求输入ini文件,但是你明白了......)
答案 1 :(得分:0)
你使用过Wordpress MU吗?他们巧妙而清晰地解决了这类问题。他们使用了oAuth
和Cookies
,而不是将其存储在sessions
中。
如果您无法使用oAuth
,我猜最好的选择是cookies
。使用domain cookies
和类似于Apache Virtual Hosts
的东西,您可以获得MySQL的所有身份验证详细信息,正如您所说的引用表并基于域/用户名,您可以使用该实例。
我们将此概念称为多租户应用程序。