首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Yii2多租户体系结构-选择正确的数据库

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

Stack Overflow用户
提问于 2016-12-22 14:53:50
回答 2查看 1.6K关注 0票数 2

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

到目前为止我所做的:

  • 我在config/web.php文件中声明了所有不同的数据库
  • 我有一个主数据库,它将每个用户对应于他的数据库。因此,当有人登录时,应用程序知道应该使用什么数据库。

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

我用以下代码创建了一个文件组件/ActiveRecord.php:

代码语言:javascript
复制
<?php
namespace app\components;
use Yii;

class ActiveRecord extends \yii\db\ActiveRecord {

    public static function getDb() {
        if (isset($_SESSION['userdb'])) {
            $currentDB = $_SESSION['userdb'];
            return Yii::$app->get($currentDB);
        }
    }

}?>

所以..。登录时,我将数据库保存在会话和上述文件中,该文件扩展了默认的ActiveRecord,我重写了getDb函数,并选择了自己的函数。随后,我更改了所有模型,使它们扩展了我的ActiveRecord。

我不确定这个策略是否正确,但它几乎奏效。

问题在哪里:

一切都很好除了..。RBAC!对于RBAC,我使用yii2-rbac扩展。问题是,用户不是从数据库中获取角色,而是从config/web.php文件中的第一个声明数据库中获取角色。因此,无论登录用户是什么,都使用第一个db。

Question(s):

  1. 我该如何解决这个问题?您是否知道将角色授予登录用户的文件在哪里?
  2. 额外的问题:你认为这个策略是错误的吗?如果是的话,你会有什么建议?

提前感谢您的时间和支持。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-23 18:35:29

问题1:如何解决这个问题?您是否知道将角色授予登录用户的文件在哪里?

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

  • 安装上面的网址,或者只是在你的文件中添加“mdmsoft/yii2-admin”:"~2.0",然后运行composer更新
  • 成功安装此扩展后,运行迁移以创建RBAC表,如果您已经跳过了它。yii migrate --migrationPath=@yii/rbac/migrations
  • 您必须在main.php中进行一些配置,以便告诉应用程序有关公共路由的信息,对于所有其他应用程序,路由系统将在它们上实现RBAC。
  • 这是您必须在main.php文件中添加的内容。 'components' => [], 'as access' => [ 'class' => 'mdm\admin\components\AccessControl', 'allowActions' => [ 'site/login', // add or remove allowed actions to this list 'site/logout', 'site/error', 'site/index', ] ]
  • 上述设置将告诉您的应用程序使登录、注销、错误和索引功能在站点控制器下是公开的,所有其他应用程序路由都需要有RBAC分配来执行操作。
  • 在我的例子中,main.php存在于后端/config/main.php中,您可以根据您的需求使用可能是公共的/config/main.php

问题2:奖金问题:你认为这个策略是错误的吗?如果是的话,你会有什么建议?

我认为您的方法是不可扩展的,我建议您创建一个主数据库,并将其用于您的应用程序租户及其数据库。

  • 在主数据库中设置具有租户名称、数据库所需参数的租户表
  • 在应用程序中建立主数据库连接,用于获取所有租户,并在那里存储来自主数据库的DB连接。 'db' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=127.0.0.1;dbname=master-db', 'username' => 'root', 'password' => 'root', 'charset' => 'utf8', ]
  • 现在,在登录页面上,显示租户列表以选择他们的信息、,如果您正在为每个租户使用唯一的域,您也可以使用域名。如果您使用的是唯一的域,那么您必须在主数据库中存储带有租户信息的域名,以便能够获得基于该域的租户信息。

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

代码语言:javascript
复制
``
  $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; } }

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

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

干杯!

票数 2
EN

Stack Overflow用户

发布于 2016-12-22 16:20:06

这是关于数据库管理器的文档。

如果您想从不同的数据库获取rbac信息,这应该是可行的。

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

代码语言:javascript
复制
<?php

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

然后转到您的配置文件,并找到authmanger部分。它应该是这样的:

代码语言:javascript
复制
'authManager' => [
'class' => 'yii\rbac\DbManager',
'db'=> require(__DIR__ . '/rbacdb.php'),
'assignmentTable'=>'<tableName>',
'itemChildTable'=>'<tableName>',
'itemTable'=>'<tableName>',
'ruleTable'=>'<tableName>'
]

编辑:重新阅读post...each之后,用户不需要自己的rbac表/模式。使用Yii现有的系统。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41285880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档