YII2多租户体系结构 - 选择正确的数据库



我正在使用yii2构建应用程序,并且正在使用多租户体系结构。所以...每个客户都有自己的数据库(相同的结构)。

我到目前为止所做的:

  • 我在config/web.php文件中声明所有不同的数据库
  • 我有一个主数据库,将每个用户与他的数据库相关。因此,当某人登录时,该应用知道数据库应使用的。

我做了什么,但我不确定:

我创建了一个文件组件/activerecord.php,并具有以下代码:

<?php
namespace appcomponents;
use Yii;
class ActiveRecord extends yiidbActiveRecord {
    public static function getDb() {
        if (isset($_SESSION['userdb'])) {
            $currentDB = $_SESSION['userdb'];
            return Yii::$app->get($currentDB);
        }
    }
}?>

so ...在登录时,我在会话和上述文件中保存数据库,该文件扩展了默认的activereCord i覆盖getDB函数,然后我选择自己的功能。随后,我更改了所有模型,因此它们扩展了我的ActivereCord。

我不确定这个策略是否正确,但几乎可以起作用。

在哪里问题:

除了... rbac!对于RBAC,我使用YII2-RBAC扩展。问题在于,用户不是从他的数据库中获得他的角色,而是从config/web.php文件中的第一个声明的数据库中获得角色。因此,无论登录用户的登录如何,都使用第一个DB。

问题:

  1. 我该如何解决这个问题?您是否对将签名为登录的用户赋予角色的文件有任何想法?
  2. 奖励问题:您认为此策略是错误的吗?如果是这样,您会建议什么?

非常感谢您的时间和支持。

问题#1:我如何解决此问题问题?您是否对将签名为登录的用户赋予角色的文件有任何想法?

我建议您为此目的使用yii2 admin扩展名(https://github.com/mdmsoft/yii2-admin),该扩展将解决您的问题,这是管理用户角色的最佳扩展。使用此链接更好地理解(https://github.com/mdmsoft/yii2-admin/blob/master/master/docs/guide/configuration.md)

  • 以上安装以上以上的URL或只需添加" mdmsoft/yii2-admin":" 〜2.0" 在您的composer.json文件中并运行 Composer Update 。<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  • 成功安装了此扩展程序运行迁移后,以创建RBAC表,如果您已经跳过了。 yii migrate --migrationPath=@yii/rbac/migrations

  • 您必须在main.php中进行一些配置,以告诉您有关公共路线的应用程序,并且对于所有其他应用程序路线系统将在其上实现RBAC。

  • 这是您必须在main.php文件中添加的内容。

    'components' => [], 'as access' => [ 'class' => 'mdmadmincomponentsAccessControl', 'allowActions' => [ 'site/login', // add or remove allowed actions to this list 'site/logout', 'site/error', 'site/index', ] ]

  • 上面的设置将告诉您的应用程序,以在站点控制器下公开登录,注销,错误和索引功能,并且所有其他应用程序路由需要具有RBAC分配以执行操作。

  • main.php 在我的情况下存在于后端/config/main.php中,您可以根据自己的要求使用可以使用的是//config/config/main.php

问题#2:奖励问题:您认为此策略是错误的吗?如果是这样,您会建议什么?

我认为您的方法无法扩展,我建议您创建一个主数据库,并使用其数据库为您的应用程序租户使用它。

  • 主数据库中带有租户名称的设置租户表,数据库必需参数
  • 在您的应用程序中进行主数据库连接,用于获取所有租户,并在那里存储主数据库中的DB连接。

    'db' => [ 'class' => 'yiidbConnection', 'dsn' => 'mysql:host=127.0.0.1;dbname=master-db', 'username' => 'root', 'password' => 'root', 'charset' => 'utf8', ]

  • 现在在登录页面上显示租户列表以选择其信息,如果您使用每个租户使用唯一的域名,也可以使用域名播放。如果您使用的是唯一域,则必须在主数据库中存储带有租户信息的域名,以便能够根据域获得租户信息。

//在成功登录页面上设置会话值读取用户域并从主数据库中获取租户信息,然后添加到会话中。

``
  $tenant = Tenant::findOne(Yii::$app->request->post('tenant_id'));
  Yii::$app->session->set('DB_HOST', $tenant->DB_host);
  Yii::$app->session->set('DB_USER', $tenant->DB_username);
  Yii::$app->session->set('DB_PASS', $tenant->DB_password);
  Yii::$app->session->set('DB_NAME', $tenant->DB_name);
``
  • 拥有租户信息后,您可以从主数据库中获取租户,然后将其数据库设置添加到会话中。

  • 创建 BaseModel.php 类,并使用所有应用程序模型类扩展。

  • 在您中 basemodel.php 添加以下方法以基于域或租户选择从登录页面进行运行时DB连接。

public static function getDb(){ if ( Yii::$app->session->get('DB_HOST') ){ $host = Yii::$app->session->get('DB_HOST'); $dbName = Yii::$app->session->get('DB_NAME'); $dsn = "mysql:host=$host;dbname=$dbName"; Yii::$app->db->dsn = $dsn; Yii::$app->db->username = Yii::$app->session->get('DB_USER'); Yii::$app->db->password = Yii::$app->session->get('DB_PASS'); return Yii::$app->db; } }

  • 通过这样做,您将可以选择添加从后端到主数据库的多个租户,这将在您的应用程序中自动使用。

我相信这些信息对您有帮助。

欢呼!!

这是dbmanager上的文档。

如果您想从其他数据库中获取RBAC信息,则应该有效。

在您的配置文件夹中,创建一个名为rbacdb.php的文件。添加以下内容:

<?php
return [
'class' => 'yiidbConnection',
'dsn' => 'mysql:host=<db host or ip>;dbname=<dbname>',
'username' => '<dbuser>',
'password' => '<dbPassword>',
'charset' => 'utf8',
];

然后转到您的配置文件并找到" authmanger"部分。看起来应该这样:

'authManager' => [
'class' => 'yiirbacDbManager',
'db'=> require(__DIR__ . '/rbacdb.php'),
'assignmentTable'=>'<tableName>',
'itemChildTable'=>'<tableName>',
'itemTable'=>'<tableName>',
'ruleTable'=>'<tableName>'
]

编辑:重读您的帖子后...每个用户不需要自己的RBAC表/架构。使用YII拥有的系统。

最新更新