2015-03-25 21:39:07 13163次浏览 2条回答 0 悬赏 5 金钱

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这个变量是怎么定义的,,刚学习这个框架,前辈多指点,帮忙解决下这个问题

  • 回答于 2015-03-26 13:34 举报
    //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 条回复
    回复于 2015-03-26 16:17 回复

    为什么我登录成功后,页面一跳转$this->_identity 值变为null , 这样Yii::$app->user->isGuest 值又变成true了

    回复于 2015-03-26 17:18 回复

    你是怎么确定你登录成功,然后有这两种状态变化的呀,

    回复于 2015-03-26 22:18 回复

    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,
            ]);
        }
    }
    
    回复于 2015-03-28 21:29 回复

    当用户登录成功,要对这个状态保持有两种情况。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,
    中间还会有一些其它的判断,如访问超时,具体细节要去看代码。

  • 回答于 2015-03-26 16:33 举报

    我不会用YII写登陆、不知道怎么用那个LoginFrom、还有就是那个行为权限啥的、请大神指教

您需要登录后才可以回答。登录 | 立即注册
bobysky
见习主管

bobysky

注册时间:2015-03-01
最后登录:2016-10-05
在线时长:23小时7分
  • 粉丝6
  • 金钱0
  • 威望0
  • 积分230

热门问题