多租户 Laravel:动态数据库连接

问题描述

我目前正在阅读多租户 Laravel 解决方案(1 个应用程序,每个“客户端/租户”具有单独的数据库),我遇到了很多具有很多功能但相当大和笨重的包.我看到了 Mohamed Said 的视频(Laravel 中的多租户:迁移、测试和切换租户)。

在这个视频中,他解释了如何建立一个多租户系统,它有 2 个数据库连接,一个用于房东,一个用于租户,所有租户数据库都将位于其中。

到目前为止一切顺利,现在我想为每个租户动态创建与其他数据库服务器/主机的连接(我的共享主机在新主机上创建每个数据库)。

我想知道实现这一目标的最佳方法是什么(安全方面),并且出现错误的机会最少。因此,第一个选择是将主机、数据库用户名密码存储在房东的租户表中,这样我就可以轻松访问该数据,但如果数据库受到威胁,也会带来风险。

另一种方法是我一直在试验包含连接所需数据的 .env 文件

将被加载/覆盖的 env 文件将只包含几个变量,例如: TENANT_DB_HOST,TENANT_DB_DATABASE,TENANT_DB_USERNAME,....

 public function configure()
{

     //filename .env.tenant.tenantsname
    //load the addional env varibles from the specific .env file
    $dotenv = Dotenv::createUnsafeMutable(base_path(),'.env.tenant.'.$this->name);
    $dotenv->load();

  
    //fill the values
    config([
        'database.connections.tenant.host' =>  $_ENV['TENANT_DB_HOST'],'database.connections.tenant.database' =>  $_ENV['TENANT_DB_DATABASE'],'database.connections.tenant.username' =>  $_ENV['TENANT_DB_USERNAME'],'database.connections.tenant.password' =>  $_ENV['TENANT_DB_PASSWORD'],'database.connections.tenant.port' =>  $_ENV['TENANT_DB_PORT'],]);


    DB::purge('tenant');

    DB::reconnect('tenant');

    Schema::connection('tenant')->getConnection()->reconnect();

    return $this;
}

这样我就可以将 .env 文件存储在服务器上 www 文件夹之外的文件夹中。这降低了泄露数据的风险。

在上面的示例中,我创建了将为每个租户覆盖的 MUTABLE 环境变量。 目前这段代码适用于迁移我的数据库,并且连接是通过代码执行的。但是,我对 Laravel 还很陌生,老实说,我不知道 $_ENV 在 Laravel 中的表现。我的服务器启用了 OPCache,并且感觉像我在上面的代码中所做的那样更改 ENV 变量可能会导致错误。就像租户连接到错误数据库一样,因为 ENV 变量在应用程序的另一个实例中被“缓存”或覆盖。

您推荐的最佳方法是什么?数据库方法或 .env 方法,我对缓存覆盖/污染的 env 变量的担忧是否有效?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)