熟悉Yii的同學(xué)都知道Yii安裝好后默認(rèn)的會(huì)創(chuàng)建user表,表中有個(gè)字段 auth_key泪漂。這個(gè)字段是干啥的呢卸伞?以前沒用到過,所以一直沒有關(guān)心它娘香,這次一次偶然的排除bug的過程中苍狰,發(fā)現(xiàn)了下面的代碼
文件位置 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;
}
經(jīng)過測試,每次登陸成功后Yii都會(huì)調(diào)用這個(gè)方法烘绽,用來獲取保存或者刪除cookie數(shù)據(jù)淋昭,從這個(gè)方法中可以看到,auth_key的主要作用是為了安全驗(yàn)證安接,畢竟cookie在瀏覽器中保存中翔忽,別人是可以篡改的(雖然Yii中的cookie本來就是httpOnly的,是無法直接通過js修改的)盏檐,這個(gè)方法就保證了cookie無法被輕易篡改歇式,因?yàn)閏ookie中保存著auth_key、id(用戶ID)胡野、duration(cookie過期時(shí)間)材失,如果不做任何驗(yàn)證的話,用戶可能通過瀏覽器直接篡改cookie中的用戶ID硫豆,這樣他就能隨意登錄任何用戶的賬號了龙巨。
而auth_key在數(shù)據(jù)庫中保存著,別人無法知道熊响,這樣就算改了cookie中的用戶ID旨别,也無法登錄用戶賬號,因?yàn)?code>validateAuthKey方法會(huì)做驗(yàn)證汗茄,如果cookie中的auth_key和數(shù)據(jù)庫中的不一致昼榛,就直接走下面的removeIdentityCookie
方法了,直接清除cookie剔难,退出登錄狀態(tài)了胆屿。