在yii,登入頁面選擇記住密碼,下次就會自動登陸
前些天,自己增加了一個web應用,但是發現雖然選擇記住密碼,沒選退出,關閉浏覽器,重新進入還會跳轉到登陸頁面
自動登入是利用cookie實作的
配置User元件
首先在配置檔案的components中設定user元件
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
'idParam' => '__check',
'identityCookie'=> ['name'=>'_check','httpOnly' => true],
],
登陸
vendor\yiisoft\yii2\web\User.php的login中
$this->switchIdentity($identity, $duration);
先登入在調用switchIdentity方法,設定認證資訊,在退出的時候也需要調用這個方法
- 設定session的有效期
- 如果cookie的有效期大于0并且允許自動登入,那麼就把使用者的認證資訊儲存到cookie中,調用sendIdentityCookie方法
- 如果允許自動登入,删除cookie資訊。這個是用于退出的時候調用的。退出的時候傳遞進來的$identity為null
sendIdentityCookie
存儲在cookie中的使用者資訊包含有三個值:
-
- $identity->getId()
- $identity->getAuthKey()
- $duration
getId()和getAuthKey()是在IdentityInterface接口中的。在設定User元件的時候,這個User Model是必須要實作IdentityInterface接口的。是以,可以在User Model中得到
第三值就是cookie的有效期
自動從cookie登入
使用者的認證資訊已經存儲到cookie中了,下次直接從cookie裡面取資訊然後設定就可以了
Yii提供了AccessControl來判斷使用者是否登入,有了這個就不需要在每一個action裡面再判斷了
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['logout'],
'rules' => [
[
'actions' => ['logout'],
'allow' => true,
'roles' => ['@'],
],
],
],
];
}
在AccessControl通路控制裡面通過IsGuest屬性來判斷是否是認證使用者,然後在getIsGuest方法裡面是調用getIdentity來擷取使用者資訊,如果為空就是遊客(未登入),否則是認證使用者。
是認證使用者,調用renewAuthStatus(),重新生成使用者認證資訊
renewAuthStatus()先通過session來判斷使用者,因為使用者登入後就已經存在于session中了。然後再判斷如果是自動登入,那麼就通過 loginByCookie()方法用cookie資訊來登入。
loginByCookie()先讀取cookie值,然後$data = json_decode($value, true);反序列化為數組。
要想實作自動登入,這三個值都必須有值。在User Model中還必須要實作findIdentity、validateAuthKey這兩個方法。
退出
logout()