• 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是在yiiconsoleApplication|yiiwebuser.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

  • 相关阅读:
    C#类的访问修饰符
    C#中抽象类和接口的区别
    C#正则表达式Regex类的介绍
    .net平台借助第三方推送服务在推送Android消息(极光推送)
    C#钩子类 几乎捕获键盘鼠标所有事件
    .net平台推送ios消息
    c# 滚动字幕的实现
    .net 序列化与反序列化
    Python学习---Django的新工程设置模板
    Python学习---DjangoForm的学习
  • 原文地址:https://www.cnblogs.com/shiguangkejian/p/5149175.html
Copyright © 2020-2023  润新知