3

我开发了一个具有两个不同注册的站点,并且我有 2 个不同的表,我使用 RbacDB,并且在组件部分的 Web 配置中我有用户配置,据此我想知道如何使用 2 个不同的字段配置文件?

配置:

'components' => [
    'request' => [
        // !!! insert a secret key in the following (if it is empty) - this is required by cookie validation
        'cookieValidationKey' => '213h2i3121h12osiajls',
    ],
    'cache' => [
        'class' => 'yii\caching\FileCache',
    ],
    'user' => [
        'identityClass' => 'app\models\User',
        'enableAutoLogin' => true,
    ],
    // Here after user I need to add another config user-two
    'user-two' => [
        'identityClass' => 'app\models\SecondUser',
        'enableAutoLogin' => true,
    ],

当我这样做时,显示此错误 在此处输入图像描述

谢谢!

4

3 回答 3

8

尝试在用户二组件中设置类属性:

'user-two' => [
    'class' => 'yii\web\User'
    'identityClass' => 'app\models\SecondUser',
    'enableAutoLogin' => true,
],

或创建从 yii\web\User 类继承的新类并设置如下:

'user-two' => [
    'class' => 'app\models\NewClassInheritedFromUserClass'
    ....
]

也许这会对你有所帮助。

于 2016-02-07T16:03:15.003 回答
1

您必须为第二个身份创建一个 Web 用户类

namespace app\components;

class UserTwo extends \yii\web\User{
}

而不是在配置中指定类名

'user-two' => [
        'class'=> 'app\components\UserTwo'
        'identityClass' => 'app\models\SecondUser',
        'enableAutoLogin' => true,
    ],
于 2016-02-07T15:59:59.533 回答
1

我已经浏览了 yii2 框架内部。据我了解,您可以按照以下技术制作 N 个身份;


  • 以上解决方案只是部分答案和一些有用的建议。请按照我的以下深度更改,您可以根据需要创建 N 个身份。
  • 当您不想实现复杂的 RBAC(基于角色的访问控制)并且只想根据控制器的请求过滤访问时,N 个身份非常有用。

  • 让我们假设我必须创建另一个名为“特许经营权”的身份,而不是现有的用户,它在 Yii2 框架内很好地耦合。


数据库迁移

  1. 使用命令创建一个新的迁移文件

    yii migrate/create create_franchise
    
  2. 将已可用迁移文件的内容复制粘贴到PROJECT_NAME\console\migrations位置,例如“ m170311_105858_create_user.php ”,并将表名从“user”重命名为“franchise”。

  3. 现在,运行迁移命令

    yii/migrate
    
    • 你必须在命令提示符下得到这样的东西

        Apply the above migrations? (yes|no) [no]:yes
      
        applying m170311_105950_create_franchise
        create table {{%franchise}} ... done (time: 1.304s)
        applied m170311_105950_create_franchise (time: 1.350s)
      
  4. 检查 DB 是否创建了 DB。(我假设您已经在PROJECT_NAME\common\config\main-local.php中进行了数据库设置)

  5. 请注意,无论身份类别是什么,它现在都应在“特许经营”表上方使用。

创建特许经营模式

  1. 只需转到“Gii”模块并为新创建的特许经营表创建一个模型。

  2. 模型位置必须是PROJECT_NAME\common\models\Franchise.php

  3. 确保 Model 类实现了 IdentityInterface并且还实现了IdentityInterface的强制方法


身份等级

  1. 如果你去位置PROJECT_NAME\vendor\yiisoft\yii2\web\User.php。这个类在你的项目中到处被称为 Yii::$app->user。复制粘贴该类的内容并创建一个名为PROJECT_NAME\vendor\yiisoft\yii2\web\Franchise.php的新文件并将内容粘贴到其中。在文件中进行以下更改。

    • 找到“用户”并将其替换为“特许经营权”。
    • 找到“用户”并将其替换为“特许经营权”。
    • 查找$loginUrl = ['site/login']; 并将其替换为$loginUrl = ['franchise/login']; 因为您将有不同的控制器来处理与特许经营相关的操作。
    • 查找$identityCookie = ['name' => '_identity', 'httpOnly' => true]; 并将' name '替换为' _fidentity '(你可以看到区别,身份cookie必须是唯一的)
    • 找到$authTimeoutParam = '__expire'; 并将其替换为$authTimeoutParam = '_f_expire';

PROJECT_NAME\vendor\yiisoft\yii2\web\Application.php

  1. Application.php添加下面的方法,

    public function getFranchise()
    {
        return $this->get('franchise');
    }
    
  2. 还可以找到方法coreComponents()并添加一个如下条目,

    'Franchise' => ['class' => 'yii\web\Franchise'],
    

PROJECT_NAME\frontend\config\main.php

  1. 内部组件在“用户”条目之后添加以下条目,

     'franchise' => [
            'identityClass' => 'common\models\Franchise',
            'enableAutoLogin' => true,
            'class' => 'yii\web\Franchise',
            'identityCookie' => ['name' => '_fidentity-frontend', 'httpOnly' => true],
        ],
    
于 2017-03-11T14:44:50.507 回答