Yii2框架實現(xiàn)注冊和登錄教程
注冊
在advanced模板中,進入frontend/index.php?r=site%2Fsignup頁面,可以看到框架的注冊頁面
填寫完Username、Email和Password后點擊Signup后,如果格式不對,frontend/models/SignuForm中的rules()函數(shù)會進行初步驗證,所有格式正確后,數(shù)據(jù)傳輸?shù)?frontend/controllers /SiteController中的 actionSignup()函數(shù)中,函數(shù)加載用戶輸入的注冊信息,在frontend/models/SignupForm中的signup()函數(shù),
以下引用的文字為解釋函數(shù)中的具體細節(jié),不閱讀不影響整體,因為沒有折疊文字功能,故采用引用的方法,下同
if (!$this->validate()) { return null; }
signup() 函數(shù)首先調(diào)用 yii2/base/Model中的validate() 函數(shù)進行驗證
第一步,清除使用frontend/models/SignuForm中的rules()函數(shù)在用戶輸入時的錯誤信息
if ($clearErrors) { $this->clearErrors(); }
第二步,beforeValidate()函數(shù)觸發(fā)beforeValidate事件并返回true
第三步,設(shè)置scenario,默認是default
第四步,因為這里的$attributeNames為null,
$attributeNames = $this->activeAttributes();
執(zhí)行后返回
array(3) { [0]=> string(8) "username" [1]=> string(5) "email" [2]=> string(8) >"password" }
第五步,$this->getActiveValidators()會得到frontend/models/SignuForm中的rules()中11條驗證規(guī)則給validateAttributes()進行驗證
第六步,執(zhí)行afterValidate()函數(shù)觸發(fā)afterValidate事件
最后 如果所有驗證都通過,$this->hasErrors()為false,所以函數(shù)最后返回true
我們看一下數(shù)據(jù)表user的字段
用戶輸入了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ù)進行加密,如果PHP沒有password_hash函數(shù),就使用crypt函數(shù)加密,初步判斷應(yīng)該是為了兼容PHP低于5.5的版本,畢竟大于5.5的版本才開始有password_hash函數(shù)
common/models/User的signup()函數(shù)在對password加密后,就會繼續(xù)生成一個auth key,auth key是當用戶在登錄的時候點擊 remember me的時候的驗證信息,
auth key生成的方法也是在yii2/base/Security中的generateRandomString,generateRandomString調(diào)用generateRandomKey函數(shù),如果你的PHP版本為是5.2~5.6或者是7,那就是用random_bytes生成一個32個字節(jié)的字符串,如果不是,當你用的系統(tǒng)時windows并且安裝了OpenSSL,就會調(diào)用openssl_random_pseudo_bytes函數(shù)生成,如果你未安裝OpenSSL,就會使用mcrypt_create_iv生成。
如果你使用的系統(tǒng)不是windows,就需要調(diào)用/dev/urandom,FreeBSD系統(tǒng)特殊,會調(diào)用/dev/random,然后調(diào)用stream_set_read_buffer方法生成8字節(jié)的字符文件,生成后,通過fread函數(shù)讀取該文件中的32個字節(jié),然后返回該數(shù)據(jù)。
password_reset_token在用戶注冊的時候是為空的,當用戶忘記密碼在登錄頁面點擊reset it 后生成的,用來給用法發(fā)送郵件后重置密碼時進行驗證。
status 在common/models/User中定義的
const STATUS_DELETED = 0;
const STATUS_ACTIVE = 10;
用戶注冊時rules中的status默認為為10,
created_time和updated_time也是在common/models/User中的behaviors()函數(shù)中生成
用戶的數(shù)據(jù)驗證合格,加上框架生成的數(shù)據(jù),然后存儲進數(shù)據(jù)的user表里。
登錄
關(guān)于frontend/controllers/SiteController中的actionSignup()中的
if (Yii::$app->getUser()->login($user)) { return $this->goHome(); }
就是用戶注冊后,這時該用戶的數(shù)據(jù)已經(jīng)寫入數(shù)據(jù)庫了,開始登錄的過程了
登錄的過程在yii2/web/User里的login()函數(shù)中
第一步,執(zhí)行beforeLogin()函數(shù)觸發(fā)beforeLogin事件
第二步,switchIdentity()函數(shù)把個人信息換成當前用戶的信息,把所有的cookie都銷毀,然后把當前用戶的信息都存入到session和cookie中
第三步,獲取當前用戶的id和用戶登錄的ip,并寫入到log中
第四步,執(zhí)行afterLogin()函數(shù)觸發(fā)afterLogin事件
最后 返回true
判斷登錄成功后,return $this->goHome();跳轉(zhuǎn)到主頁。
- Yii2.0框架模型添加/修改/刪除數(shù)據(jù)操作示例
- Yii2.0框架模型多表關(guān)聯(lián)查詢示例
- yii2.0框架使用 beforeAction 防非法登陸的方法分析
- Yii2框架實現(xiàn)登陸添加驗證碼功能示例
- Yii2中組件的注冊與創(chuàng)建方法
- Yii2 中實現(xiàn)單點登錄的方法
- Yii2框架實現(xiàn)登錄、退出及自動登錄功能的方法詳解
- 修改yii2.0用戶登錄使用的user表為其它的表實現(xiàn)方法(推薦)
- YII2自動登錄Cookie總是失效的解決方法
- Yii2實現(xiàn)多域名跨域同步登錄退出
- Yii2中OAuth擴展及QQ互聯(lián)登錄實現(xiàn)方法
- YII2框架中自定義用戶認證模型,完成登陸和注冊操作示例
相關(guān)文章
PHP中static關(guān)鍵字原理的學(xué)習(xí)研究分析
PHP中static關(guān)鍵字原理的學(xué)習(xí)研究分析,學(xué)習(xí)php的朋友可以參考下。2011-07-07PHP foreach遍歷多維數(shù)組實現(xiàn)方式
這篇文章主要為大家詳細介紹了PHP foreach遍歷多維數(shù)組實現(xiàn)方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11在VSCode中配置PHP開發(fā)環(huán)境的實戰(zhàn)步驟
最近要寫一些可視化的網(wǎng)站,所以先把需要的環(huán)境配好吧,下面這篇文章主要給大家介紹了關(guān)于在VSCode中配置PHP開發(fā)環(huán)境的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2022-11-11php使用curl判斷網(wǎng)頁404(不存在)的方法
這篇文章主要介紹了php使用curl判斷網(wǎng)頁404(不存在)的方法,通過curl獲取http頭信息進行404錯誤判斷,非常簡便易懂,需要的朋友可以參考下2016-06-06php 下 html5 XHR2 + FormData + File API 上傳文件操作實例分析
這篇文章主要介紹了php 下 html5 XHR2 + FormData + File API 上傳文件操作,結(jié)合實例形式分析了php 下使用html5 XHR2 + FormData + File API 實現(xiàn)上傳文件操作方法與相關(guān)操作注意事項,需要的朋友可以參考下2020-02-02PHP使用in_array函數(shù)檢查數(shù)組中是否存在某個值
這篇文章主要介紹了PHP使用in_array函數(shù)檢查數(shù)組中是否存在某個值,較為詳細的分析了in_array函數(shù)的功能、定義及相關(guān)的使用技巧與注意事項,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03