yii2登錄流程


今天研究了下yii2 的登陸流程

 

在數據庫中建立user表

CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增ID',
`username` varchar(255) NOT NULL COMMENT '用戶名',
`auth_key` varchar(32) NOT NULL COMMENT '自動登錄key',
`password_hash` varchar(255) NOT NULL COMMENT '加密密碼',
`password_reset_token` varchar(255) DEFAULT NULL COMMENT '重置密碼token',
`email` varchar(255) NOT NULL COMMENT '郵箱',
`role` smallint(6) NOT NULL DEFAULT '10' COMMENT '角色等級',
`status` smallint(6) NOT NULL DEFAULT '10' COMMENT '狀態',
`created_at` int(11) NOT NULL COMMENT '創建時間',
`updated_at` int(11) NOT NULL COMMENT '更新時間',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8 COMMENT='用戶表'

 

然后跟着測試發現跳轉流程大概是這樣的

1、SiteController

 public function actionLogin()
    {
        if (!\Yii::$app->user->isGuest) {
            return $this->goHome();
        }
        
        $model = new LoginForm();
        if ($model->load(Yii::$app->request->post()) && $model->login()) {//加在post數據,並驗證登陸
            return $this->goBack();
        } else {
            $this->layout = "login.php";
            return $this->render('login', [
                'model' => $model,
            ]);
        }
    }

2、跟進到$model->login,也就是common/modules/LoginForm.php文件中的login函數

public function login()
    {
        if ($this->validate()) {//表單驗證通過
            return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0);
        } else {
            return false;
        }
    }

3、這個表單驗證,主要是對loginFrom中的rules規則進行驗證

public function rules()
{
        return [
            // username and password are both required
            [['username', 'password'], 'required'],
            // rememberMe must be a boolean value
            ['rememberMe', 'boolean'],
            // password is validated by validatePassword()
            ['password', 'validatePassword'],
        ];
}

4、其中,password需要去驗證validatePassword函數,這個函數用於判斷密碼的格式是否正確

public function validatePassword($attribute, $params)
{
        if (!$this->hasErrors()) {
            $user = $this->getUser();
            if (!$user || !$user->validatePassword($this->password)) {
                $this->addError($attribute, \Yii::t('login', 'Incorrect username or password.'));
            }
        }
}

5、這里需要注意的是,$this->getUser();的時候,已經獲得了user對象,其中包含了該用戶的password_hash這個變量。

這里面的!$user->validatePassword($this->password)是去判斷了common/modules/user.php中的函數
public function validatePassword($password)
{
        return Yii::$app->security->validatePassword($password, $this->password_hash);//其中$password,是用戶輸入的密碼,而$this->password_hash是數據庫中存儲的用戶password_hash
}

 

用戶密碼正確后,回到2、執行

return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0);

這步驟是執行用戶登錄操作,並保存cookie
其中
Yii::$app->user是在\yii\console\Application|\yii\web\user.php
public function login(IdentityInterface $identity, $duration = 0)
{
        if ($this->beforeLogin($identity, false, $duration)) {
            $this->switchIdentity($identity, $duration);

        /************* 

         switchIdentity函數用於
         1、設置session的有效期

          2、如果cookie的有效期大於0並且允許自動登錄,那么就把用戶的認證信息保存到cookie中

          3、如果允許自動登錄,刪除cookie信息。這個是用於退出的時候調用的。退出的時候傳遞進來的$identity為null

       ************/
            $id = $identity->getId();
            $ip = Yii::$app->getRequest()->getUserIP();
            if ($this->enableSession) {
                $log = "User '$id' logged in from $ip with duration $duration.";
            } else {
                $log = "User '$id' logged in from $ip. Session not enabled.";
            }
            Yii::info($log, __METHOD__);
            $this->afterLogin($identity, false, $duration);
        }

        return !$this->getIsGuest();
}

 

以上內容參考了 http://www.kuitao8.com/20150518/3747.shtml


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM