美文网首页PHP经验分享Yii
Yii user表中auth_key字段的作用

Yii user表中auth_key字段的作用

作者: 叶秋real | 来源:发表于2019-07-11 23:47 被阅读3次

    熟悉Yii的同学都知道Yii安装好后默认的会创建user表,表中有个字段 auth_key。这个字段是干啥的呢?以前没用到过,所以一直没有关心它,这次一次偶然的排除bug的过程中,发现了下面的代码

    文件位置 vendor/yiisoft/yii2/web/User.php

    protected function getIdentityAndDurationFromCookie()
    {
        $value = Yii::$app->getRequest()->getCookies()->getValue($this->identityCookie['name']);
        if ($value === null) {
            return null;
        }
        $data = json_decode($value, true);
        if (is_array($data) && count($data) == 3) {
            list($id, $authKey, $duration) = $data;
            /* @var $class IdentityInterface */
            $class = $this->identityClass;
            $identity = $class::findIdentity($id);
            if ($identity !== null) {
                if (!$identity instanceof IdentityInterface) {
                    throw new InvalidValueException("$class::findIdentity() must return an object implementing IdentityInterface.");
                } elseif (!$identity->validateAuthKey($authKey)) {
                    Yii::warning("Invalid auth key attempted for user '$id': $authKey", __METHOD__);
                } else {
                    return ['identity' => $identity, 'duration' => $duration];
                }
            }
        }
        $this->removeIdentityCookie();
        return null;
    }
    

    经过测试,每次登陆成功后Yii都会调用这个方法,用来获取保存或者删除cookie数据,从这个方法中可以看到,auth_key的主要作用是为了安全验证,毕竟cookie在浏览器中保存中,别人是可以篡改的(虽然Yii中的cookie本来就是httpOnly的,是无法直接通过js修改的),这个方法就保证了cookie无法被轻易篡改,因为cookie中保存着auth_key、id(用户ID)、duration(cookie过期时间),如果不做任何验证的话,用户可能通过浏览器直接篡改cookie中的用户ID,这样他就能随意登录任何用户的账号了。

    而auth_key在数据库中保存着,别人无法知道,这样就算改了cookie中的用户ID,也无法登录用户账号,因为validateAuthKey方法会做验证,如果cookie中的auth_key和数据库中的不一致,就直接走下面的removeIdentityCookie方法了,直接清除cookie,退出登录状态了。

    原文地址 https://www.shiqidu.com/d/766

    相关文章

      网友评论

        本文标题:Yii user表中auth_key字段的作用

        本文链接:https://www.haomeiwen.com/subject/hoqskctx.html