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和Mysqlweb应用开发核心技术 第1部分 Php基础-1 开始了解php
Jul 03 PHP
mysql 查询指定日期时间内sql语句实现原理与代码
Dec 16 PHP
浅析PHP程序防止ddos,dns,集群服务器攻击的解决办法
Jun 18 PHP
浅析HTTP消息头网页缓存控制以及header常用指令介绍
Jun 28 PHP
php预定义变量使用帮助(带实例)
Oct 30 PHP
php验证是否是md5编码的简单代码
Apr 01 PHP
php通过前序遍历树实现无需递归的无限极分类
Jul 10 PHP
ThinkPHP中使用Ueditor富文本编辑器
Sep 02 PHP
php将服务端的文件读出来显示在web页面实例
Oct 31 PHP
php实现文件管理与基础功能操作
Mar 21 PHP
PHPExcel实现的读取多工作表操作示例
Apr 14 PHP
深入理解PHP+Mysql分布式事务与解决方案
Dec 03 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
php 数组二分法查找函数代码
2010/02/16 PHP
解析php框架codeigniter中如何使用框架的session
2013/06/24 PHP
php错误日志简单配置方法
2016/07/11 PHP
javascript之水平横向滚动歌词同步的应用
2007/05/07 Javascript
Jquery 基础学习笔记
2009/05/29 Javascript
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
js弹出层之1:JQuery.Boxy (二)
2011/10/06 Javascript
JavaScript 参数中的数组展开 [译]
2012/09/21 Javascript
javascript实现yield的方法
2013/11/06 Javascript
JQuery中使用Ajax赋值给全局变量失败异常的解决方法
2014/08/18 Javascript
复制网页内容,粘贴之后自动加上网址的实现方法(脚本之家特别整理)
2014/10/16 Javascript
javascript关于继承的用法汇总
2014/12/20 Javascript
jQuery仿gmail实现fixed布局的方法
2015/05/27 Javascript
详解JavaScript编程中的数组结构
2015/10/24 Javascript
JavaScript中Function函数与Object对象的关系
2015/12/17 Javascript
JS与jQuery实现隔行变色的方法
2016/09/09 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
2018/08/31 Javascript
vue简单练习 桌面时钟的实现代码实例
2019/09/19 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
2020/02/17 Javascript
[03:07]【DOTA2亚洲邀请赛】我们,梦开始的地方
2017/03/07 DOTA
[00:35]TI7不朽珍藏III——寒冰飞龙不朽展示
2017/07/15 DOTA
[49:40]2018DOTA2亚洲邀请赛小组赛 A组加赛 TNC vs Newbee
2018/04/03 DOTA
[54:09]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
Python计算三角函数之asin()方法的使用
2015/05/15 Python
python生成验证码图片代码分享
2016/01/28 Python
Pyspider中给爬虫伪造随机请求头的实例
2018/05/07 Python
django框架之cookie/session的使用示例(小结)
2018/10/15 Python
python接口自动化之ConfigParser配置文件的使用详解
2020/08/03 Python
Python中pass的作用与使用教程
2020/11/13 Python
python3定位并识别图片验证码实现自动登录功能
2021/01/29 Python
浅谈关于html5中图片抛物线运动的一些心得
2018/01/09 HTML / CSS
普师专业个人自荐信范文
2013/11/26 职场文书
教师一帮一活动总结
2014/07/08 职场文书
员工生日活动方案
2014/08/24 职场文书
2014年生产管理工作总结
2014/12/23 职场文书
一篇文章弄清楚Ajax请求的五个步骤
2022/03/17 Javascript