Yii2框架实现注册和登录教程

 更新时间:2016年09月30日 09:41:48   作者:wallen  
这篇文章主要介绍了Yii2框架实现注册和登录教程的相关资料,需要的朋友可以参考下

注册

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

填写完Username、Email和Password后点击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
第四步,因为这里的$attributeNames为null,

$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的字段

用户输入了username、password和email,Yii2框架是如何生成其他的字段的呢,先看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/User的signup()函数在对password加密后,就会继续生成一个auth key,auth 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 后生成的,用来给用法发送邮件后重置密码时进行验证。

status 在common/models/User中定义的

const STATUS_DELETED = 0;
const STATUS_ACTIVE = 10;

用户注册时rules中的status默认为为10,
created_time和updated_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都销毁,然后把当前用户的信息都存入到session和cookie中
第三步,获取当前用户的id和用户登录的ip,并写入到log中
第四步,执行afterLogin()函数触发afterLogin事件

最后 返回true

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

相关文章

  • PHP中static关键字原理的学习研究分析

    PHP中static关键字原理的学习研究分析

    PHP中static关键字原理的学习研究分析,学习php的朋友可以参考下。
    2011-07-07
  • PHP foreach遍历多维数组实现方式

    PHP foreach遍历多维数组实现方式

    这篇文章主要为大家详细介绍了PHP foreach遍历多维数组实现方式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • php控制文件下载速度的方法

    php控制文件下载速度的方法

    这篇文章主要介绍了php控制文件下载速度的方法,实例分析了php操作文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • php使用curl伪造浏览器访问操作示例

    php使用curl伪造浏览器访问操作示例

    这篇文章主要介绍了php使用curl伪造浏览器访问操作,结合实例形式分析了php使用curl伪造浏览器访问的原理与具体实现技巧,需要的朋友可以参考下
    2019-09-09
  • 在VSCode中配置PHP开发环境的实战步骤

    在VSCode中配置PHP开发环境的实战步骤

    最近要写一些可视化的网站,所以先把需要的环境配好吧,下面这篇文章主要给大家介绍了关于在VSCode中配置PHP开发环境的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • php使用curl判断网页404(不存在)的方法

    php使用curl判断网页404(不存在)的方法

    这篇文章主要介绍了php使用curl判断网页404(不存在)的方法,通过curl获取http头信息进行404错误判断,非常简便易懂,需要的朋友可以参考下
    2016-06-06
  • php链表用法实例分析

    php链表用法实例分析

    这篇文章主要介绍了php链表用法,实例分析了php创建链表及针对链表节点的增加、删除、更新与遍历等常用操作,需要的朋友可以参考下
    2015-07-07
  • php7 新增功能实例总结

    php7 新增功能实例总结

    这篇文章主要介绍了php7 新增功能,结合实例形式总结分析了php7 新增功能、特性及相关操作注意事项,需要的朋友可以参考下
    2020-05-05
  • php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析

    php 下 html5 XHR2 + FormData + File API 上传文件操作实例分析

    这篇文章主要介绍了php 下 html5 XHR2 + FormData + File API 上传文件操作,结合实例形式分析了php 下使用html5 XHR2 + FormData + File API 实现上传文件操作方法与相关操作注意事项,需要的朋友可以参考下
    2020-02-02
  • PHP使用in_array函数检查数组中是否存在某个值

    PHP使用in_array函数检查数组中是否存在某个值

    这篇文章主要介绍了PHP使用in_array函数检查数组中是否存在某个值,较为详细的分析了in_array函数的功能、定义及相关的使用技巧与注意事项,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03

最新评论