Yii2.0 的用户登录问题 [ 2.0 版本 ]
user组件:yii\web\user.php中的如下代码
public function setIdentity($identity)
{
if ($identity instanceof IdentityInterface) {
$this->_identity = $identity;
$this->_access = [];
} elseif ($identity === null) {
$this->_identity = null;
} else {
throw new InvalidValueException('The identity object must implement IdentityInterface.');
}
}
这里面当$this->_identity
被赋值$identity后 Yii::$app->user->isGuest
就被设置成false了,表示已登录用户。 我的疑问isGuest是怎么被设置的,isGuest这个变量是怎么定义的,,刚学习这个框架,前辈多指点,帮忙解决下这个问题
共 2 个回答
-
//isGuest从这获取 public function getIsGuest() { return $this->getIdentity() === null; } //这个方法调用的$this->_identity,即是你上面那个方法设定的 //你上面那个方法也是传得一个参数进去的,它是一个实例于IdentityInterface接口的对像,具体实现自已写 //它里面有各种获取_identity的方法,比如findIdentity(),,, public function getIdentity($autoRenew = true) { if ($this->_identity === false) { if ($this->enableSession && $autoRenew) { $this->renewAuthStatus(); } else { return null; } } return $this->_identity; }
共 4 条回复public function actionLogin() { if (!\Yii::$app->user->isGuest) { return $this->goHome(); } $model = new LoginForm(); if ($model->load(Yii::$app->request->post()) && $model->login()) { /*在这里我var_dump(Yii::$app->user->isGuest ); 值为false, 执行下面一句$this->goBack() ,跳到主页后,var_dump(Yii::$app->user->isGuest ); 值变为true,表示未认证用户, 在这个问题纠结很久了, 也没思路去排错 ,,请指教下.*/ return $this->goBack(); } else { return $this->renderPartial ('login', [ 'model' => $model, ]); } }
当用户登录成功,要对这个状态保持有两种情况。1.当前进程内,由于登录成功,identity已经记录,直接返回即可,不存在问题;2.另启一个进程,就如你上面说的页面跳转,这个时候如需进行登录判断,服务端是不记得之前登录成功的客户端的,所以需要客户端提交一个标识,一般就是cookie,与session关联的即是session_id,在第1种方式成功之后它便会生成,在yii中如果开启了自动登录,还将生成另一个cookie,默认名为_identity,另启进程登录过程如下:
Yii::$app->user->isGuest public function getIsGuest() public function getIdentity($autoRenew = true)//如果执行这一步,_identity=false时必需要开启session才会继续做下一步的登录处理,
以上步骤,上面贴出的代码都可以看到。所以你没有开启session,又不是重新登录,所以下一步的登录过程就不会执行了,你要先确定好这一步,并最好在浏览器下查看一下页面跳转前后的cookie变化。
接下来的过程就是重新登录
$this->renewAuthStatus();
你个方法首先会根据你session_id,查出你session中存放的identity id,然后再根据id,去获取identity,执行的是findIdentity($id);
这个方法是你自定义的,默认会去查表。如果能成功取回并相应条件满足,自然登录成功,
前面还说了有一个cookie,_identity,
这就是另外一个情况,自动登录,当你的浏览器关闭,再访问时,session_id不存在了,上面的查询肯定失败,此时会再
loginByCookie()去查,具体查的过程不说了。如果查找成功,会重新生成session_id,
中间还会有一些其它的判断,如访问超时,具体细节要去看代码。
bobysky
最后登录:2016-10-05
在线时长:23小时7分
- 粉丝6
- 金钱0
- 威望0
- 积分230