成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Yii2框架源碼分析之如何實(shí)現(xiàn)注冊(cè)和登錄

chemzqm / 2341人閱讀

摘要:在用戶注冊(cè)的時(shí)候是為空的,當(dāng)用戶忘記密碼在登錄頁(yè)面點(diǎn)擊后生成的,用來(lái)給用法發(fā)送郵件后重置密碼時(shí)進(jìn)行驗(yàn)證。如有錯(cuò)誤,不吝賜教。

注冊(cè)

advanced模板中,進(jìn)入frontend/index.php?r=site%2Fsignup頁(yè)面,可以看到框架的注冊(cè)頁(yè)面

填寫完Username、EmailPassword后點(diǎn)擊Signup后,如果格式不對(duì),frontend/models/SignuForm中的rules()函數(shù)會(huì)進(jìn)行初步驗(yàn)證,所有格式正確后,數(shù)據(jù)傳輸?shù)?frontend/controllers /SiteController中的 actionSignup()函數(shù)中,函數(shù)加載用戶輸入的注冊(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ù)在用戶輸入時(shí)的錯(cuò)誤信息

if ($clearErrors) {
    $this->clearErrors();
}

第二步,beforeValidate()函數(shù)觸發(fā)beforeValidate事件并返回true
第三步,設(shè)置scenario,默認(rèn)是default
第四步,因?yàn)檫@里的$attributeNamesnull,

$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的字段

用戶輸入了usernamepasswordemail,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/Usersignup()函數(shù)在對(duì)password加密后,就會(huì)繼續(xù)生成一個(gè)auth key,auth key是當(dāng)用戶在登錄的時(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在用戶注冊(cè)的時(shí)候是為空的,當(dāng)用戶忘記密碼在登錄頁(yè)面點(diǎn)擊reset it 后生成的,用來(lái)給用法發(fā)送郵件后重置密碼時(shí)進(jìn)行驗(yàn)證。
statuscommon/models/User中定義的

const STATUS_DELETED = 0;
const STATUS_ACTIVE = 10;

用戶注冊(cè)時(shí)rules中的status默認(rèn)為為10,
created_timeupdated_time也是在common/models/User中的behaviors()函數(shù)中生成

用戶的數(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();
}

就是用戶注冊(cè)后,這時(shí)該用戶的數(shù)據(jù)已經(jīng)寫入數(shù)據(jù)庫(kù)了,開(kāi)始登錄的過(guò)程了
登錄的過(guò)程在yii2/web/User里的login()函數(shù)中
第一步,執(zhí)行beforeLogin()函數(shù)觸發(fā)beforeLogin事件
第二步,switchIdentity()函數(shù)把個(gè)人信息換成當(dāng)前用戶的信息,把所有的cookie都銷毀,然后把當(dāng)前用戶的信息都存入到sessioncookie
第三步,獲取當(dāng)前用戶的id和用戶登錄的ip,并寫入到log
第四步,執(zhí)行afterLogin()函數(shù)觸發(fā)afterLogin事件
最后 返回true

判斷登錄成功后,return $this->goHome();跳轉(zhuǎn)到主頁(yè)。

如有錯(cuò)誤,不吝賜教。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/30509.html

相關(guān)文章

  • Yii2系列教程四:實(shí)現(xiàn)用戶注冊(cè),驗(yàn)證,登錄

    摘要:開(kāi)始使用郵箱配置好了之后,我們就可以開(kāi)始使用了,首先我們來(lái)修改一下我們的導(dǎo)航欄,因?yàn)槲覀兿雽?shí)現(xiàn)的就是我們常常看到的在導(dǎo)航欄的右側(cè)的注冊(cè)和登錄按鈕。 原文來(lái)自: https://jellybool.com/post/programming-with-yii2-integrating-user-regi... 本來(lái)打算昨晚寫的這篇教程,但是忙著約會(huì)去了,所以現(xiàn)在補(bǔ)上吧。 上一篇...

    boredream 評(píng)論0 收藏0
  • 打通LaravelYii2任督二脈

    摘要:于是直接暴力開(kāi)干,找說(shuō)明書查詢。測(cè)試登錄,果然不通。一般情況下,這時(shí)候應(yīng)該遵照官方手冊(cè),開(kāi)始建立自己相配套的數(shù)據(jù)庫(kù)體系。數(shù)據(jù)庫(kù)是連通了,出現(xiàn)了熟悉的錯(cuò)誤找不到表。登入登出完全正常,終于可以和和和美美地住在一個(gè)小房子里了。 Yii2與Laravel相愛(ài)相殺已經(jīng)很久了,導(dǎo)致廣大PHP愛(ài)好者必須選邊站隊(duì),生怕自己站錯(cuò)了陣營(yíng)。作為一個(gè)已經(jīng)上了Yii2賊船很久的人想換船是需要很大勇氣的,能不能就...

    kohoh_ 評(píng)論0 收藏0
  • Yii2 驗(yàn)證手機(jī)號(hào)、郵箱唯一性

    摘要:好比注冊(cè)功能模塊,手機(jī)號(hào)郵箱注冊(cè)這些,肯定是要驗(yàn)證其的唯一性的,重復(fù)了登錄就會(huì)混亂。需求分析使用框架自帶的在不刷新頁(yè)面的情況下驗(yàn)證手機(jī)號(hào)郵箱唯一性。相關(guān)資料表單驗(yàn)證問(wèn)題注冊(cè)時(shí)驗(yàn)證手機(jī)號(hào)唯一 序言 驗(yàn)證唯一性很重要,說(shuō)不上用得很普及,但是也必須要有。好比注冊(cè)功能模塊,手機(jī)號(hào)、郵箱注冊(cè)這些,肯定是要驗(yàn)證其的唯一性的,重復(fù)了登錄就會(huì)混亂。那么如何使用Yii2自帶的targetClass驗(yàn)證唯...

    spacewander 評(píng)論0 收藏0
  • Yii2 驗(yàn)證手機(jī)號(hào)、郵箱唯一性

    摘要:好比注冊(cè)功能模塊,手機(jī)號(hào)郵箱注冊(cè)這些,肯定是要驗(yàn)證其的唯一性的,重復(fù)了登錄就會(huì)混亂。需求分析使用框架自帶的在不刷新頁(yè)面的情況下驗(yàn)證手機(jī)號(hào)郵箱唯一性。相關(guān)資料表單驗(yàn)證問(wèn)題注冊(cè)時(shí)驗(yàn)證手機(jī)號(hào)唯一 序言 驗(yàn)證唯一性很重要,說(shuō)不上用得很普及,但是也必須要有。好比注冊(cè)功能模塊,手機(jī)號(hào)、郵箱注冊(cè)這些,肯定是要驗(yàn)證其的唯一性的,重復(fù)了登錄就會(huì)混亂。那么如何使用Yii2自帶的targetClass驗(yàn)證唯...

    FuisonDesign 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<