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


Posted in PHP onSeptember 30, 2016

注册

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

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

填写完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的字段

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

用户输入了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 相关文章推荐
PHP入门
Oct 09 PHP
PHP 得到根目录的 __FILE__ 常量
Jul 23 PHP
五款常用mysql slow log分析工具的比较分析
May 22 PHP
PHP获取http请求的头信息实现步骤
Dec 16 PHP
解析isset与is_null的区别
Aug 09 PHP
php从字符串创建函数的方法
Mar 16 PHP
文件上传之SWFUpload插件(代码)
Jul 30 PHP
round robin权重轮循算法php实现代码
May 28 PHP
PHP Mysqli 常用代码集合
Nov 12 PHP
thinkPHP5.0框架URL访问方法详解
Mar 18 PHP
PHP中的函数声明与使用详解
May 27 PHP
PHP调用其他文件中的类
Apr 02 PHP
php多线程并发实现方法
Sep 30 #PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
Sep 30 #PHP
分享PHP-pcntl 实现多进程代码
Sep 30 #PHP
PHP编写daemon process详解及实例代码
Sep 30 #PHP
PHP 极验验证码实例讲解
Sep 29 #PHP
php自定义函数转换html标签示例
Sep 29 #PHP
php自定义函数实现汉字转换utf8编码的方法
Sep 29 #PHP
You might like
Excel数据导入Mysql数据库的实现代码
2008/06/05 PHP
PHP 数组遍历顺序理解
2009/09/09 PHP
PHP基础学习之流程控制的实现分析
2013/04/28 PHP
typecho插件编写教程(三):保存配置
2015/05/28 PHP
PHP生成各种常见验证码和Ajax验证过程
2016/01/10 PHP
PHP实现SMTP邮件的发送实例
2018/09/27 PHP
javascript实现的DES加密示例
2013/10/30 Javascript
js对图片base64编码字符串进行解码并输出图像示例
2014/03/17 Javascript
window.location不跳转的问题解决方法
2014/04/17 Javascript
跟我学Nodejs(二)--- Node.js事件模块
2014/05/21 NodeJs
js实现jquery的offset()方法实例
2015/01/10 Javascript
使用angular写一个hello world
2015/01/23 Javascript
JS+CSS实现滑动切换tab菜单效果
2015/08/25 Javascript
JavaScript模块化之使用requireJS按需加载
2017/04/12 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
php简单数据库操作类的封装
2017/06/08 Javascript
ionic2自定义cordova插件开发以及使用(Android)
2017/06/19 Javascript
JS实现json对象数组按对象属性排序操作示例
2018/05/18 Javascript
Vue keepAlive 数据缓存工具实现返回上一个页面浏览的位置
2019/05/10 Javascript
jQuery 图片查看器插件 Viewer.js用法简单示例
2020/04/04 jQuery
[40:27]完美世界DOTA2联赛PWL S3 PXG vs GXR 第一场 12.19
2020/12/24 DOTA
python采用requests库模拟登录和抓取数据的简单示例
2014/07/05 Python
利用Python2下载单张图片与爬取网页图片实例代码
2017/12/25 Python
详解python实现识别手写MNIST数字集的程序
2018/08/03 Python
Python中的asyncio代码详解
2019/06/10 Python
Python 堆叠柱状图绘制方法
2019/07/29 Python
Spark处理数据排序问题如何避免OOM
2020/05/21 Python
pycharm 2020 1.1的安装流程
2020/09/29 Python
印度手工编织服装和家居用品商店:Fabindi
2019/10/07 全球购物
定义一结构体变量,用其表示点坐标,并输入两点坐标,求两点之间的距离
2015/08/17 面试题
秘书英文求职信范文
2014/01/31 职场文书
党员群众路线学习心得体会
2014/11/04 职场文书
2015年七一建党节演讲稿
2015/03/19 职场文书
《夜莺的歌声》教学反思
2016/02/22 职场文书
演讲稿:​快乐,从不抱怨开始!
2019/04/02 职场文书
vue css 相对路径导入问题级踩坑记录
2022/06/05 Vue.js