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();跳转到主页。
推荐阅读