我已经开始使用Yii框架了,我对 UserIdentity 组件的使用有一个新问题。
我的应用程序有一个管理模块,它将作为显示在真实网站中的内容的后台。此模块有自己的管理员tbl_admin_user
表。
我想从一般网站中分离出该模块的登录方法(以检查该表而不是tbl_user
)。为此,我假设我需要为模块而不是完整的应用程序实现 UserIdentity 的身份验证方法,如果我错了,请更正我。
当我覆盖那个方法时,我什么都没得到。管理模块使用位于* protected \ components * 的 UserIdentity ,而不是自己的。
有什么建议吗?
答案 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)
我设法通过将此类添加到管理模块默认控制器来覆盖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();
}
因此,如果您想更改此模块的登录系统,只需为该模块创建另一个用户,您就可以将用户功能与应用用户功能分离。