在我的应用中,我使用会话来存储一些用户的数据(例如姓名,角色)。我在yii2上使用User
上的默认common/models
课程,并且我按用户ID获取了我需要的数据。
问题是数据如果用户在没有输入密码的情况下恢复他们之前的会话(使用记住我选项),我在会话中存储会丢失为了解决这个问题,我尝试修改并将用户数据保存在validateAuthKey()
User
中的public function validateAuthKey($authKey)
{
$user = Member::findOne(['account_id' => Yii::$app->user->id]);
// Save on session
Yii::$app->session->set('name', $user->first_name . ' ' . $user->last_name);
Yii::$app->session->set('position', $user->position);
// .. other data
return true;
}
方法中,以便在yii2检查authkey恢复会话时调用它。如:
Member
如您所见,我使用已登录用户的ID来查找Yii::$app->user->id
。但通过这样做,我得到了#34;试图获得非对象的属性"来自loginByCookie()
的例外情况。我只能在登录过程完成后获取id。在窥探后,我发现来自User
vendor\yiisoft\yii2\Web
的{{1}}用于登录。有没有办法保存用户的数据,而不会在供应商上篡改代码?也许在执行loginByCookie()
之后会发生某种事件。
答案 0 :(得分:0)
创建您自己的用户模型extends \ yii \ web \ User
namespace frontend\components;
class User extends \yii\web\User
{
protected function afterLogin($identity, $cookieBased, $duration)
{
...Do something here...
parent::afterLogin($identity, $cookieBased, $duration);
}
}
修改配置(main.php)。
'components' => [
'user' => [
'class' => 'frontend\components\User',
'identityClass' => 'common\models\User',
...
]
]
答案 1 :(得分:0)
将以下代码放在 common / config / bootstrap.php
中即使用户通过cookie登录,也会调用EVENT_AFTER_LOGIN
。
use yii\web\User;
use yii\base\Event;
Event::on(User::className(), User::EVENT_AFTER_LOGIN, function() {
$user = Member::findOne(['account_id' => Yii::$app->user->id]);
// Save on session
Yii::$app->session->set('name', $user->first_name . ' ' . $user->last_name);
Yii::$app->session->set('position', $user->position);
});