Yii 2 模块中的独立用户实例
Yii 2 Separate User Instance in Module
我在数据库中有两个不同的用户 table(编辑者和用户)。如您所知,用户 table 和编辑器 table 只是在模块中使用。
我使用 this way 在 Yii 1.1 中将用户实例与模块和主应用程序分开。
但我在 yii 2 中找不到方法。我尝试扩展 yii\web\User 并在模块中更改用户 class 但结果相同。如果我在模块中登录,则可以从模块外和任何地方访问相同的用户实例。
我的模块初始化是这样的:
public function init()
{
parent::init();
\Yii::$app->set('user', [
'class' => 'app\modules\yonetim\components\yonetimUser',
'identityClass' => 'app\models\Editor',
'enableAutoLogin' => true,
'loginUrl' => ['yonetim/default/login'],
]);
}
我也试试这个方法;在 config.php
'components' => [
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'editor' => [
'class' => 'yii\web\User',
'identityClass' => 'app\models\Editor',
'enableAutoLogin' => true,
],
],
但是这次我没有使用授权角色(比如@)
如何在我的模块中使用不同的用户实例?
我没有测试过这个,但你可能会发现类似 switchIdentity()
的东西有效,所以在你的模块中使用这个;
public function init()
{
parent::init();
$editor = new app\models\Editor
$user = Yii::$app->user;
$user->switchIdentity($editor);
}
我为不同的登录实例找到了另一种方法。 Yii2 使用 session id 参数进行身份验证。所以我们需要改变它。
将您的 modules\module_name\module_name.php 文件更改为如下所示:
public function init()
{
parent::init();
Yii::$app->set('user', [
'class' => 'yii\web\User',
'identityClass' => 'app\models\Editor',
'enableAutoLogin' => false,
'loginUrl' => ['yonetim/default/login'],
'identityCookie' => ['name' => 'editor', 'httpOnly' => true],
'idParam' => 'editor_id', //this is important !
]);
}
idParam 值在 yii\web\User 中定义为默认值:$idParam = '__id';
因此,如果我们更改此值,应用程序和模块将使用不同的用户实例。
您可以为您的应用程序设置不同的会话名称:
'components' => [
'session' => [
'name' => 'application-session-name',
],
],
对于模块:
'components' => [
'session' => [
'name' => 'module-session-name',
],
],
我在数据库中有两个不同的用户 table(编辑者和用户)。如您所知,用户 table 和编辑器 table 只是在模块中使用。
我使用 this way 在 Yii 1.1 中将用户实例与模块和主应用程序分开。
但我在 yii 2 中找不到方法。我尝试扩展 yii\web\User 并在模块中更改用户 class 但结果相同。如果我在模块中登录,则可以从模块外和任何地方访问相同的用户实例。
我的模块初始化是这样的:
public function init()
{
parent::init();
\Yii::$app->set('user', [
'class' => 'app\modules\yonetim\components\yonetimUser',
'identityClass' => 'app\models\Editor',
'enableAutoLogin' => true,
'loginUrl' => ['yonetim/default/login'],
]);
}
我也试试这个方法;在 config.php
'components' => [
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
],
'editor' => [
'class' => 'yii\web\User',
'identityClass' => 'app\models\Editor',
'enableAutoLogin' => true,
],
],
但是这次我没有使用授权角色(比如@)
如何在我的模块中使用不同的用户实例?
我没有测试过这个,但你可能会发现类似 switchIdentity()
的东西有效,所以在你的模块中使用这个;
public function init()
{
parent::init();
$editor = new app\models\Editor
$user = Yii::$app->user;
$user->switchIdentity($editor);
}
我为不同的登录实例找到了另一种方法。 Yii2 使用 session id 参数进行身份验证。所以我们需要改变它。
将您的 modules\module_name\module_name.php 文件更改为如下所示:
public function init()
{
parent::init();
Yii::$app->set('user', [
'class' => 'yii\web\User',
'identityClass' => 'app\models\Editor',
'enableAutoLogin' => false,
'loginUrl' => ['yonetim/default/login'],
'identityCookie' => ['name' => 'editor', 'httpOnly' => true],
'idParam' => 'editor_id', //this is important !
]);
}
idParam 值在 yii\web\User 中定义为默认值:$idParam = '__id'; 因此,如果我们更改此值,应用程序和模块将使用不同的用户实例。
您可以为您的应用程序设置不同的会话名称:
'components' => [
'session' => [
'name' => 'application-session-name',
],
],
对于模块:
'components' => [
'session' => [
'name' => 'module-session-name',
],
],