2

我试图找出一种好的、安全的方法来让单个文件目录(我们的应用程序的一个实例)连接到一系列多种可能性中的单个数据库。我们过去做事的方式是每个客户都有一组文件和一个数据库,他们的一组文件将被配置为直接链接到他们的数据库。这行得通,但是很难在所有客户中保持应用程序的标准化版本;确保每个人都有最新的更新。

我正在考虑解决它的一种方法是拥有一个用于登录过程的独特的通用数据库。在该数据库中将有一个包含用户特定数据库名称的字段,然后将其存储在他们的会话中。一旦他们登录,应用程序就会查看会话以获取他们的数据库的名称,并直接连接到该数据库。

我很确定这种方法会奏效,我只是担心它可能会出现一些安全问题。关于如何处理这个问题的任何建议?

4

2 回答 2

1

对于每个客户,您唯一需要知道的是数据库连接的用户、密码、dbname 和主机名。我只需将它们存储在一个配置文件中,每个客户一个,根据客户命名:

/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

(呃,对不起,你不会 require_once 一个 ini 文件,但你明白了......)

于 2012-06-06T18:18:12.713 回答
0

你用过 Wordpress MU 吗?他们巧妙而清晰地解决了这类问题。他们使用oAuthand Cookies,而不是将它们存储在sessions.

如果你不能使用oAuth,我想最好的选择是cookies。使用domain cookies与 Apache 类似的东西Virtual Hosts,您可以从 MySQL 获得所有身份验证详细信息,正如您所说,它引用了表并基于域/用户名,您可以使用该实例。

我们将此概念称为多租户应用程序。

于 2012-06-06T18:14:20.387 回答