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初学者的8点有效建议
Nov 20 PHP
PHP可逆加密/解密函数分享
Sep 25 PHP
php二维数组合并及去重复的方法
Mar 04 PHP
PHP JSON格式的中文显示问题解决方法
Apr 09 PHP
CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)
Sep 01 PHP
PHP foreach遍历多维数组实现方式
Nov 16 PHP
yii2-GridView在开发中常用的功能及技巧总结
Jan 07 PHP
PHP正则匹配操作简单示例【preg_match_all应用】
Jul 10 PHP
PHP设计模式之单例模式定义与用法分析
Mar 26 PHP
Yii2框架控制器、路由、Url生成操作示例
May 27 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
Nov 09 PHP
discuz论坛更换域名,详细文件修改步骤
Dec 09 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 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
2006/10/09 PHP
探讨:如何使用PhpDocumentor生成文档
2013/06/25 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
2014/12/15 PHP
PHP文件与目录操作示例
2016/12/24 PHP
PHP通过curl获取接口URL的数据方法
2018/05/31 PHP
javascript实现可改变滚动方向的无缝滚动实例
2013/06/17 Javascript
ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox
2014/05/02 Javascript
Nodejs Post请求报socket hang up错误的解决办法
2014/09/25 NodeJs
javascript进行四舍五入方法汇总
2014/12/16 Javascript
javascript实现状态栏文字首尾相接循环滚动的方法
2015/07/22 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
js按条件生成随机json:randomjson实现方法
2017/04/07 Javascript
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
2017/04/13 Javascript
详解用webpack2搭建angular2的项目
2017/06/22 Javascript
Js中async/await的执行顺序详解
2017/09/22 Javascript
Angular2之二级路由详解
2018/08/31 Javascript
layui输入框只允许输入中文且判断长度的例子
2019/09/18 Javascript
微信小程序实现通讯录列表展开收起
2020/11/18 Javascript
Vue3+elementui plus创建项目的方法
2020/12/01 Vue.js
nodejs处理tcp连接的核心流程
2021/02/26 NodeJs
Python使用POP3和SMTP协议收发邮件的示例代码
2019/04/16 Python
django-allauth入门学习和使用详解
2019/07/03 Python
python调用webservice接口的实现
2019/07/12 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
python元组的概念知识点
2019/11/19 Python
python异常处理、自定义异常、断言原理与用法分析
2020/03/23 Python
Python中BeautifulSoup通过查找Id获取元素信息
2020/12/07 Python
python中append函数用法讲解
2020/12/11 Python
Pop In A Box英国:Funko POP搪胶公仔
2019/05/27 全球购物
汽车检测与维修应届毕业生求职信
2013/10/19 职场文书
公司合作协议书范本
2014/04/18 职场文书
工业设计专业自荐书
2014/06/05 职场文书
2014年商场国庆节活动策划方案
2014/09/16 职场文书
龙猫观后感
2015/06/09 职场文书
关于JavaScript轮播图的实现
2021/11/20 Javascript
《艾尔登法环》Boss腐烂树灵很有可能是《黑暗之魂3》的一个废案
2022/04/11 其他游戏