注册

advanced模板中,进入frontend/index.php?r=site%2Fsignup页面,可以看到框架的注册页面

填写完UsernameEmailPassword后点击Signup后,如果格式不对,frontend/models/SignuForm中的rules()函数会进行初步验证,所有格式正确后,数据传输到 frontend/controllers /SiteController中的 actionSignup()函数中,函数加载用户输入的注册信息,在frontend/models/SignupForm中的signup()函数,

以下引用的文字为解释函数中的具体细节,不阅读不影响整体,因为没有折叠文字功能,故采用引用的方法,下同
if (!$this->validate()) {return null;
}

signup() 函数首先调用 yii2/base/Model中的validate() 函数进行验证
第一步,清除使用frontend/models/SignuForm中的rules()函数在用户输入时的错误信息

if ($clearErrors) {$this->clearErrors();
}

第二步,beforeValidate()函数触发beforeValidate事件并返回true
第三步,设置scenario,默认是default
第四步,因为这里的$attributeNamesnull

$attributeNames = $this->activeAttributes();

执行后返回

array(3) { [0]=> string(8) "username" [1]=> string(5) "email" [2]=> string(8) >"password" }

第五步,$this->getActiveValidators()会得到frontend/models/SignuForm中的rules()中11条验证规则给validateAttributes()进行验证
第六步,执行afterValidate()函数触发afterValidate事件
最后 如果所有验证都通过,$this->hasErrors()false,所以函数最后返回true

我们看一下数据表user的字段

用户输入了usernamepasswordemailYii2框架是如何生成其他的字段的呢,先看password_hash,在SignupFrom中的signup函数中的密码生成是setPassword函数,该函数在common/models/User中,setPassword函数调用了yii2/base/Security中的每一条规则generatePasswordHash函数。

if (function_exists('password_hash')) {/** @noinspection PhpUndefinedConstantInspection */return password_hash($password, PASSWORD_DEFAULT, ['cost' => $cost]);
}

如果有,就使用password_hash函数进行加密,如果PHP没有password_hash函数,就使用crypt函数加密,初步判断应该是为了兼容PHP低于5.5的版本,毕竟大于5.5的版本才开始有password_hash函数

common/models/Usersignup()函数在对password加密后,就会继续生成一个auth keyauth key是当用户在登录的时候点击 remember me的时候的验证信息,

auth key生成的方法也是在yii2/base/Security中的generateRandomString,generateRandomString调用generateRandomKey函数,如果你的PHP版本为是5.2~5.6或者是7,那就是用random_bytes生成一个32个字节的字符串,如果不是,当你用的系统时windows并且安装了OpenSSL,就会调用openssl_random_pseudo_bytes函数生成,如果你未安装OpenSSL,就会使用mcrypt_create_iv生成。
如果你使用的系统不是windows,就需要调用/dev/urandom,FreeBSD系统特殊,会调用/dev/random,然后调用stream_set_read_buffer方法生成8字节的字符文件,生成后,通过fread函数读取该文件中的32个字节,然后返回该数据。

password_reset_token在用户注册的时候是为空的,当用户忘记密码在登录页面点击reset it 后生成的,用来给用法发送邮件后重置密码时进行验证。
statuscommon/models/User中定义的

const STATUS_DELETED = 0;
const STATUS_ACTIVE = 10;

用户注册时rules中的status默认为为10,
created_timeupdated_time也是在common/models/User中的behaviors()函数中生成

用户的数据验证合格,加上框架生成的数据,然后存储进数据的user表里。

登录

关于frontend/controllers/SiteController中的actionSignup()中的

if (Yii::$app->getUser()->login($user)) {return $this->goHome();
}

就是用户注册后,这时该用户的数据已经写入数据库了,开始登录的过程了
登录的过程在yii2/web/User里的login()函数中
第一步,执行beforeLogin()函数触发beforeLogin事件
第二步,switchIdentity()函数把个人信息换成当前用户的信息,把所有的cookie都销毁,然后把当前用户的信息都存入到sessioncookie
第三步,获取当前用户的id和用户登录的ip,并写入到log
第四步,执行afterLogin()函数触发afterLogin事件
最后 返回true

判断登录成功后,return $this->goHome();跳转到主页。

如有错误,不吝赐教。

Yii2框架源码分析之如何实现注册和登录相关推荐

  1. Spark RPC框架源码分析(二)RPC运行时序

    前情提要: Spark RPC框架源码分析(一)简述 一. Spark RPC概述 上一篇我们已经说明了Spark RPC框架的一个简单例子,Spark RPC相关的两个编程模型,Actor模型和Re ...

  2. Linux驱动修炼之道-SPI驱动框架源码分析(上)

    Linux驱动修炼之道-SPI驱动框架源码分析(上)   SPI协议是一种同步的串行数据连接标准,由摩托罗拉公司命名,可工作于全双工模式.相关通讯设备可工作于m/s模式.主设备发起数据帧,允许多个从设 ...

  3. Android框架源码分析——从设计模式角度看 Retrofit 核心源码

    Android框架源码分析--从设计模式角度看 Retrofit 核心源码 Retrofit中用到了许多常见的设计模式:代理模式.外观模式.构建者模式等.我们将从这三种设计模式入手,分析 Retrof ...

  4. SPI驱动框架源码分析

     SPI驱动框架源码分析 2013-04-12 16:13:08 分类: LINUX SPI驱动框架源码分析 SPI协议是一种同步的串行数据连接标准,由摩托罗拉公司命名,可工作于全双工模式.相关通讯设 ...

  5. php+yii框架,yii框架源码分析(一)

    yii框架源码分析(一) 本文将对yii中的mvc,路由器,filter,组件机制等最主要的部分进行自己的一点浅析,力求说明自己做一个php mvc不是那么的遥不可及,其实是很简单的. 源码基于yii ...

  6. S3C24XX DMA框架源码分析

    基于S3C2440 的DMA 框架源码分析 基于S3C2440 的DMA 框架源码分析 二寻根溯源 1 设备类的注册 2 s3c2410_dma_init 3 s3c24xx_dma_order_se ...

  7. golang gin框架源码分析(二)---- 渐入佳境 摸索Engine ServeHTTP访问前缀树真正原理

    文章目录 全系列总结博客链接 前引 golang gin框架源码分析(二)---- 渐入佳境 摸索Engine ServeHTTP访问前缀树真正远原理 1.再列示例代码 从示例代码入手 2.r.Run ...

  8. Java集合类框架源码分析 之 LinkedList源码解析 【4】

    上一篇介绍了ArrayList的源码分析[点击看文章],既然ArrayList都已经做了介绍,那么作为他同胞兄弟的LinkedList,当然必须也配拥有姓名! Talk is cheap,show m ...

  9. leaf框架源码分析

    leaf框架源码分析 近来阅读leaf框架的代码,有些感悟,特来记录一番.既是一个总结,又是对后来阅读者的一个启发. 个人看代码的一个习惯,喜欢有上下文,因此会各个代码文件之间相互乱窜.但多看几次也就 ...

最新文章

  1. centos7安装oracle12c 一
  2. 少年班招生大扩容,清华、北大加入争夺行列,每年增至近800人
  3. 呆萌的图模型学习——基本概念(一)
  4. python生物数据分析师职业技能_数据分析师需要什么技能,数据分析行业都有什么职业?...
  5. Js自定义提示框(dialog版本)
  6. oracle 图片数据复制,Oracle如何插入图片数据?
  7. tomcat 虚拟目录与显示目录中文件列表
  8. MATLAB五子棋游戏(双人对战,可悔棋)
  9. 服务器被黑客入侵了怎么办?
  10. AutoCAD2017下载安装教程
  11. CNVD国家区块链漏洞库漏洞通报
  12. 在职MBA与普研、MEM是有区别的
  13. 链塔小程序产品更新说明
  14. 干货分享!怎么复制硬盘到新硬盘
  15. Beautifulsoup模块
  16. Mysql 循环更新
  17. python轮子下载教程
  18. 什么是计算机视觉,主要有哪些应用?
  19. python函数ppt_Python自动化操作PPT看这一篇就够了
  20. raphael参数说明

热门文章

  1. 智能硬件这5大领域竞争升级,将迎发展新模式
  2. “强化学习之父”萨顿:预测学习马上要火,AI将帮我们理解人类意识
  3. 远程办公要降薪?谷歌带头:最高下降 25%
  4. PC 时代旧神隐没,互联网的新二十年开始了
  5. GitHub 标星 2.5K+,U^2-Net 跨界肖像画,完美复刻人物细节!
  6. 微软获 OpenAI 独家 GPT-3 模型授权,是潘多拉还是聚宝盆?
  7. Confluence 6 那些文件需要备份
  8. TP-LINK、迅捷等品牌路由器存在质量问题
  9. win10配置java环境变量,解决javac不是内部或外部命令等问题
  10. LEMP+memcached