天天看點

yii自動登入

在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方法,設定認證資訊,在退出的時候也需要調用這個方法

  1. 設定session的有效期
  2. 如果cookie的有效期大于0并且允許自動登入,那麼就把使用者的認證資訊儲存到cookie中,調用sendIdentityCookie方法
  3. 如果允許自動登入,删除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()