Yii - 具有自己的UserIdentity组件的模块

时间:2011-02-16 17:07:51

标签: authentication module yii php

我已经开始使用Yii框架了,我对 UserIdentity 组件的使用有一个新问题。

我的应用程序有一个管理模块,它将作为显示在真实网站中的内容的后台。此模块有自己的管理员tbl_admin_user表。

我想从一般网站中分离出该模块的登录方法(以检查该表而不是tbl_user)。为此,我假设我需要为模块而不是完整的应用程序实现 UserIdentity 的身份验证方法,如果我错了,请更正我。

当我覆盖那个方法时,我什么都没得到。管理模块使用位于* protected \ components * UserIdentity ,而不是自己的。

有什么建议吗?

3 个答案:

答案 0 :(得分:6)

您不得导入模块标识类。 为此,只需修改扩展CWebModule的模块类中的init函数,如下所示:

public function init()
{
    $this->setImport(array(
        '#moduleName#.models.*',
        '#moduleName#.components.*',
    ));
}

因此,将导入所有模块组件(以及模型),即模块标识类。

注意:这样做,您有2个具有相同名称 UserIdentity 的导入类。 如果您的应用程序配置良好,则模块必须在模块中优先,因为其目录在include_path中的位置。 但是你应该给你的班级另外一个名字,在你的模块中扩展 CUserIdentity ,例如的 AdminUserIdentity 即可。然后在您的登录操作中,您使用新的AdminUserIdentity($ username,$ password)而不是新的UserIdentity($ username,$ password)。这将使您的代码更清晰。

答案 1 :(得分:0)

在Yii2中的

我设法通过将此类添加到管理模块默认控制器来覆盖User类:

    public function init() {
    // this overrides the User Identity class
    // and uses the one provided by the admin module
    \Yii::$app->set("user", [
         'class' => 'yii\web\User',
         'identityClass' => 'app\modules\admin\models\User',
         'enableAutoLogin' => true,
    ]);
}

答案 2 :(得分:0)

在GiiModule中我们使用了:

/**
 * Initializes the gii module.
 */
public function init()
{
    parent::init();
    Yii::setPathOfAlias('gii',dirname(__FILE__));
    Yii::app()->setComponents(array(
        'errorHandler'=>array(
            'class'=>'CErrorHandler',
            'errorAction'=>$this->getId().'/default/error',
        ),
        'user'=>array(
            'class'=>'CWebUser',
            'stateKeyPrefix'=>'gii',
            'loginUrl'=>Yii::app()->createUrl($this->getId().'/default/login'),
        ),
        'widgetFactory' => array(
            'class'=>'CWidgetFactory',
            'widgets' => array()
        )
    ), false);
    $this->generatorPaths[]='gii.generators';
    $this->controllerMap=$this->findGenerators();
}

因此,如果您想更改此模块的登录系统,只需为该模块创建另一个用户,您就可以将用户功能与应用用户功能分离。