Laravel 用戶認(rèn)證詳解 (注冊(cè))

安裝好了laravel框架并配置好之后二打,了解用戶認(rèn)證的詳細(xì)過程

首先配置.env文件询筏,數(shù)據(jù)庫(kù)圃阳。執(zhí)行以下步驟

1. 在根目錄執(zhí)行 ?php artisan migrate 遷移默認(rèn)的數(shù)據(jù)庫(kù)文件

遷移成功

2. 在根目錄運(yùn)行 php artisan make:auth

這個(gè)命令會(huì)生成以下文件

app/Http/Controllers/HomeController.php

resources/views/auth/

resources/views/home.blade.php

resources/views/layouts/

以及修改routes/web.php文件

添加了Auth:routes()和 home路由

現(xiàn)在诅炉,實(shí)際上基于session/cookie機(jī)制的用戶認(rèn)證系統(tǒng)已經(jīng)實(shí)現(xiàn)了。

訪問/register路由可以查看注冊(cè)頁(yè)面

先注冊(cè)一個(gè)賬號(hào)看看

注冊(cè)成功之后憨募,此頁(yè)面就是routes/web.php路由中生成的home路由了

在看數(shù)據(jù)庫(kù)

有了剛才我注冊(cè)的賬號(hào)

對(duì)于這個(gè)功能,安裝到使用都很簡(jiǎn)單袁辈,但是這個(gè)認(rèn)證系統(tǒng)是如何實(shí)現(xiàn)的菜谣,涉及哪些注冊(cè)登錄等功能相關(guān)的知識(shí)點(diǎn)可以學(xué)習(xí)才是關(guān)鍵。

第一步:找到注冊(cè)相關(guān)的路由地址

那么我的跟進(jìn)方法就是先從web.php腳本中增加的Auth::routes()入手晚缩,找到上圖中注冊(cè)路由的實(shí)現(xiàn)尾膊。即調(diào)用了Auth類中的routes()靜態(tài)方法。

這個(gè)Auth實(shí)際上是在config/app.php配置文件中注冊(cè)了別名

找到這個(gè)Illuminate\Support\Facades\Auth類橡羞,看到其中有個(gè)routes()的靜態(tài)方法

給應(yīng)用注冊(cè)標(biāo)準(zhǔn)的認(rèn)證路由

方法中 static::$app->make('router')是獲取router類的實(shí)例,而這個(gè)router類的實(shí)例則是在啟動(dòng)應(yīng)用的時(shí)候通過注冊(cè)基本服務(wù)者的時(shí)候已經(jīng)注冊(cè)過的眯停。可以從public/index.php文件跟進(jìn)查看

在Router類卿泽,并且可以在該類中找到了我們需要的auth()方法

所有認(rèn)證相關(guān)的路由

找到了認(rèn)證相關(guān)的路由地址莺债,我們就可以一個(gè)個(gè)的在找到控制器以及方法,了解學(xué)習(xí)此認(rèn)證的詳細(xì)過程

第二步:查看注冊(cè)邏輯

注冊(cè)路由

獲取注冊(cè)頁(yè)面签夭,提交注冊(cè)數(shù)據(jù)

在Auth\RegisterController控制中并沒有showRegistrationForm和register方法齐邦,而是use 了一個(gè) RegisterUsers trait

返回自帶認(rèn)證的注冊(cè)頁(yè)面

處理認(rèn)證請(qǐng)求

register方法:

1. $this->validator($request->all())->validate(); 校驗(yàn)注冊(cè)請(qǐng)求參數(shù)

這個(gè)在RegisterController控制中,可以根據(jù)自定義需求更改第租,驗(yàn)證規(guī)則中措拇,email最后有一個(gè)unique:users 規(guī)則,表明該字段在users表中唯一慎宾。

2. event(new Registered($user=$this->create($request->all())));

通過$this->create($request->all());創(chuàng)建用戶

在實(shí)例化Reigstered類丐吓,這個(gè)類是用戶認(rèn)證的事件并監(jiān)聽

3. $this->guard()->login($user);

獲取一個(gè)用戶認(rèn)證的guard

那么需要了解一下Auth::guard()是如何獲取的

在Auth類以及Facade類中并沒有g(shù)uard這樣的靜態(tài)方法,但是在Facade中有

__callStatic魔術(shù)方法趟据,調(diào)用的靜態(tài)方法不存在的時(shí)候被自動(dòng)調(diào)用

static::getFacadeRoot()返回一個(gè)對(duì)象

static::getFacadeAccessor()在當(dāng)前的Auth類中重寫

返回一個(gè) auth 字符串

然后再調(diào)用static::resolveFacadeInstance(static::getFacadeAccessor());

首先返回static::$resolvedInstance[$name],如果沒有則將static::$app[$name]賦值給它券犁,在返回

那么static::$app[$name]的當(dāng)前值是什么,在何時(shí)被賦值的呢汹碱?這里暫時(shí)先可以打印一下static::$app['auth']粘衬,看看結(jié)果是什么

AuthManager的一個(gè)對(duì)象

注:如果更詳細(xì)的想了解當(dāng)前static::$app['auth'] 為什么會(huì)是AuthManager對(duì)象,就需要從入口文件跟進(jìn),是在處理請(qǐng)求的方法中handle()

中處理請(qǐng)求的時(shí)候稚新,有一步$this->bootstrap()操作勘伺,最終調(diào)回到Application應(yīng)用類的bootstrapWith()方法,遍歷一個(gè)框架定義的一些門面類實(shí)現(xiàn)各自的bootstrap()方法褂删。

回到session guard 來維護(hù) Session 存儲(chǔ)的狀態(tài)和 Cookie的認(rèn)證方式的static::$app['auth']中飞醉,追溯到上面提到的__callStatic()魔術(shù)方法中,現(xiàn)在的$instance是AuthManager對(duì)象屯阀,進(jìn)而是調(diào)用了該對(duì)象中的guard()方法冒掌。

最初我們調(diào)用的Auth::guard()的時(shí)候,沒有傳任何參數(shù)蹲盘,所有這里的$name就是null

獲取默認(rèn)的驅(qū)動(dòng)

返回config/auth.php配置文件中的defaults.guard

返回 'web'
返回web對(duì)應(yīng)的數(shù)據(jù)

最后股毫,調(diào)用當(dāng)前AuthManager類中的createSessionDriver()方法創(chuàng)建一個(gè)基于session的認(rèn)證guard

該方法中可以看到,返回的$guard是SessionGuard的一個(gè)對(duì)象召衔,所以后續(xù)我們應(yīng)用的guard相關(guān)操作都可以來這個(gè)類中查看铃诬。至此,弄明白了Auth::guard()的結(jié)果苍凛,回到接受注冊(cè)post數(shù)據(jù)的register方法中繼續(xù)

$this->guard()->login($user)趣席,創(chuàng)建完賬號(hào)之后,調(diào)用了這個(gè)方法醇蝴,看上去就知道是自動(dòng)給用戶登錄的操作了宣肚,那么剛才我們也找到了guard相關(guān)操作的類,那么可以去看看其中是否有l(wèi)ogin()方法

verdor/laravel/frameword/src/Illuminate/Auth/SessionGuard.php

接受一個(gè)$user和$remember參數(shù)悠栓。實(shí)現(xiàn)Session和Cookie機(jī)制霉涨,完成登錄功能

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市惭适,隨后出現(xiàn)的幾起案子笙瑟,更是在濱河造成了極大的恐慌,老刑警劉巖癞志,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件往枷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡凄杯,警方通過查閱死者的電腦和手機(jī)错洁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戒突,“玉大人屯碴,你說我怎么就攤上這事⊙矗” “怎么了窿锉?”我有些...
    開封第一講書人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)膝舅。 經(jīng)常有香客問我嗡载,道長(zhǎng),這世上最難降的妖魔是什么仍稀? 我笑而不...
    開封第一講書人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任洼滚,我火速辦了婚禮,結(jié)果婚禮上技潘,老公的妹妹穿的比我還像新娘遥巴。我一直安慰自己,他們只是感情好享幽,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開白布铲掐。 她就那樣靜靜地躺著,像睡著了一般值桩。 火紅的嫁衣襯著肌膚如雪摆霉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評(píng)論 1 290
  • 那天奔坟,我揣著相機(jī)與錄音携栋,去河邊找鬼。 笑死咳秉,一個(gè)胖子當(dāng)著我的面吹牛婉支,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播澜建,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼向挖,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了炕舵?” 一聲冷哼從身側(cè)響起户誓,我...
    開封第一講書人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎幕侠,沒想到半個(gè)月后帝美,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晤硕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年悼潭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舞箍。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舰褪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疏橄,到底是詐尸還是另有隱情占拍,我是刑警寧澤略就,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站晃酒,受9級(jí)特大地震影響表牢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜贝次,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一崔兴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蛔翅,春花似錦敲茄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至笋轨,卻和暖如春爽待,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背翩腐。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工鸟款, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茂卦。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓何什,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親等龙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子处渣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容