Yii2框架實(shí)現(xiàn)注冊(cè)和登錄教程
注冊(cè)
在advanced模板中,進(jìn)入frontend/index.php?r=site%2Fsignup頁(yè)面,可以看到框架的注冊(cè)頁(yè)面

填寫(xiě)完Username、Email和Password后點(diǎn)擊Signup后,如果格式不對(duì),frontend/models/SignuForm中的rules()函數(shù)會(huì)進(jìn)行初步驗(yàn)證,所有格式正確后,數(shù)據(jù)傳輸?shù)?frontend/controllers /SiteController中的 actionSignup()函數(shù)中,函數(shù)加載用戶(hù)輸入的注冊(cè)信息,在frontend/models/SignupForm中的signup()函數(shù),
以下引用的文字為解釋函數(shù)中的具體細(xì)節(jié),不閱讀不影響整體,因?yàn)闆](méi)有折疊文字功能,故采用引用的方法,下同
if (!$this->validate()) {
return null;
}
signup() 函數(shù)首先調(diào)用 yii2/base/Model中的validate() 函數(shù)進(jìn)行驗(yàn)證
第一步,清除使用frontend/models/SignuForm中的rules()函數(shù)在用戶(hù)輸入時(shí)的錯(cuò)誤信息
if ($clearErrors) {
$this->clearErrors();
}
第二步,beforeValidate()函數(shù)觸發(fā)beforeValidate事件并返回true
第三步,設(shè)置scenario,默認(rèn)是default
第四步,因?yàn)檫@里的$attributeNames為null,
$attributeNames = $this->activeAttributes();
執(zhí)行后返回
array(3) { [0]=> string(8) "username" [1]=> string(5) "email" [2]=> string(8) >"password" }
第五步,$this->getActiveValidators()會(huì)得到frontend/models/SignuForm中的rules()中11條驗(yàn)證規(guī)則給validateAttributes()進(jìn)行驗(yàn)證
第六步,執(zhí)行afterValidate()函數(shù)觸發(fā)afterValidate事件
最后 如果所有驗(yàn)證都通過(guò),$this->hasErrors()為false,所以函數(shù)最后返回true
我們看一下數(shù)據(jù)表user的字段

用戶(hù)輸入了username、password和email,Yii2框架是如何生成其他的字段的呢,先看password_hash,在SignupFrom中的signup函數(shù)中的密碼生成是setPassword函數(shù),該函數(shù)在common/models/User中,setPassword函數(shù)調(diào)用了yii2/base/Security中的每一條規(guī)則generatePasswordHash函數(shù)。
if (function_exists('password_hash')) {
/** @noinspection PhpUndefinedConstantInspection */
return password_hash($password, PASSWORD_DEFAULT, ['cost' => $cost]);
}
如果有,就使用password_hash函數(shù)進(jìn)行加密,如果PHP沒(méi)有password_hash函數(shù),就使用crypt函數(shù)加密,初步判斷應(yīng)該是為了兼容PHP低于5.5的版本,畢竟大于5.5的版本才開(kāi)始有password_hash函數(shù)
common/models/User的signup()函數(shù)在對(duì)password加密后,就會(huì)繼續(xù)生成一個(gè)auth key,auth key是當(dāng)用戶(hù)在登錄的時(shí)候點(diǎn)擊 remember me的時(shí)候的驗(yàn)證信息,
auth key生成的方法也是在yii2/base/Security中的generateRandomString,generateRandomString調(diào)用generateRandomKey函數(shù),如果你的PHP版本為是5.2~5.6或者是7,那就是用random_bytes生成一個(gè)32個(gè)字節(jié)的字符串,如果不是,當(dāng)你用的系統(tǒng)時(shí)windows并且安裝了OpenSSL,就會(huì)調(diào)用openssl_random_pseudo_bytes函數(shù)生成,如果你未安裝OpenSSL,就會(huì)使用mcrypt_create_iv生成。
如果你使用的系統(tǒng)不是windows,就需要調(diào)用/dev/urandom,FreeBSD系統(tǒng)特殊,會(huì)調(diào)用/dev/random,然后調(diào)用stream_set_read_buffer方法生成8字節(jié)的字符文件,生成后,通過(guò)fread函數(shù)讀取該文件中的32個(gè)字節(jié),然后返回該數(shù)據(jù)。
password_reset_token在用戶(hù)注冊(cè)的時(shí)候是為空的,當(dāng)用戶(hù)忘記密碼在登錄頁(yè)面點(diǎn)擊reset it 后生成的,用來(lái)給用法發(fā)送郵件后重置密碼時(shí)進(jìn)行驗(yàn)證。
status 在common/models/User中定義的
const STATUS_DELETED = 0;
const STATUS_ACTIVE = 10;
用戶(hù)注冊(cè)時(shí)rules中的status默認(rèn)為為10,
created_time和updated_time也是在common/models/User中的behaviors()函數(shù)中生成
用戶(hù)的數(shù)據(jù)驗(yàn)證合格,加上框架生成的數(shù)據(jù),然后存儲(chǔ)進(jìn)數(shù)據(jù)的user表里。
登錄
關(guān)于frontend/controllers/SiteController中的actionSignup()中的
if (Yii::$app->getUser()->login($user)) {
return $this->goHome();
}
就是用戶(hù)注冊(cè)后,這時(shí)該用戶(hù)的數(shù)據(jù)已經(jīng)寫(xiě)入數(shù)據(jù)庫(kù)了,開(kāi)始登錄的過(guò)程了
登錄的過(guò)程在yii2/web/User里的login()函數(shù)中
第一步,執(zhí)行beforeLogin()函數(shù)觸發(fā)beforeLogin事件
第二步,switchIdentity()函數(shù)把個(gè)人信息換成當(dāng)前用戶(hù)的信息,把所有的cookie都銷(xiāo)毀,然后把當(dāng)前用戶(hù)的信息都存入到session和cookie中
第三步,獲取當(dāng)前用戶(hù)的id和用戶(hù)登錄的ip,并寫(xiě)入到log中
第四步,執(zhí)行afterLogin()函數(shù)觸發(fā)afterLogin事件
最后 返回true
判斷登錄成功后,return $this->goHome();跳轉(zhuǎn)到主頁(yè)。
- Yii2.0框架模型添加/修改/刪除數(shù)據(jù)操作示例
- Yii2.0框架模型多表關(guān)聯(lián)查詢(xún)示例
- yii2.0框架使用 beforeAction 防非法登陸的方法分析
- Yii2框架實(shí)現(xiàn)登陸添加驗(yàn)證碼功能示例
- Yii2中組件的注冊(cè)與創(chuàng)建方法
- Yii2 中實(shí)現(xiàn)單點(diǎn)登錄的方法
- Yii2框架實(shí)現(xiàn)登錄、退出及自動(dòng)登錄功能的方法詳解
- 修改yii2.0用戶(hù)登錄使用的user表為其它的表實(shí)現(xiàn)方法(推薦)
- YII2自動(dòng)登錄Cookie總是失效的解決方法
- Yii2實(shí)現(xiàn)多域名跨域同步登錄退出
- Yii2中OAuth擴(kuò)展及QQ互聯(lián)登錄實(shí)現(xiàn)方法
- YII2框架中自定義用戶(hù)認(rèn)證模型,完成登陸和注冊(cè)操作示例
相關(guān)文章
PHP基于面向?qū)ο蠓庋b的分頁(yè)類(lèi)示例
這篇文章主要介紹了PHP基于面向?qū)ο蠓庋b的分頁(yè)類(lèi),結(jié)合實(shí)例形式分析了php分頁(yè)類(lèi)針對(duì)頁(yè)碼判斷、顯示等操作的封裝及分頁(yè)類(lèi)使用相關(guān)操作技巧,需要的朋友可以參考下2019-03-03
PHP設(shè)計(jì)模式之裝飾器模式定義與用法簡(jiǎn)單示例
這篇文章主要介紹了PHP設(shè)計(jì)模式之裝飾器模式定義與用法,結(jié)合簡(jiǎn)單實(shí)例形式分析了php裝飾器模式的概念、原理、定義與簡(jiǎn)單使用方法,需要的朋友可以參考下2018-08-08
基于PHP的微信公眾號(hào)的開(kāi)發(fā)流程詳解
這篇文章主要介紹了基于PHP的微信公眾號(hào)的開(kāi)發(fā)流程詳解,文章通過(guò)示例代碼和服務(wù)器及菜單配置的圖文講解介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
PHP簡(jiǎn)單實(shí)現(xiàn)文本計(jì)數(shù)器的方法
這篇文章主要介紹了PHP簡(jiǎn)單實(shí)現(xiàn)文本計(jì)數(shù)器的方法,涉及PHP針對(duì)文本文件的簡(jiǎn)單判斷,讀取及寫(xiě)入等操作技巧,需要的朋友可以參考下2016-04-04
PHP實(shí)現(xiàn)將顏色hex值轉(zhuǎn)換成rgb的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)將顏色hex值轉(zhuǎn)換成rgb的方法,涉及PHP針對(duì)字符串與數(shù)組的數(shù)學(xué)運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下2016-05-05
PHP利用ThinkPHP6完整實(shí)現(xiàn)用戶(hù)分頁(yè)功能
分頁(yè)功能在Web開(kāi)發(fā)中是一個(gè)非常常見(jiàn)的需求,特別是在處理大量數(shù)據(jù)時(shí),為了提高用戶(hù)體驗(yàn)和性能,將數(shù)據(jù)分頁(yè)展示是必不可少的,ThinkPHP6作為一款流行的PHP框架,自帶了強(qiáng)大的分頁(yè)功能,本文將詳細(xì)介紹如何使用ThinkPHP6實(shí)現(xiàn)分頁(yè)功能,需要的朋友可以參考下2023-12-12

