安裝好了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);
那么需要了解一下Auth::guard()是如何獲取的
在Auth類以及Facade類中并沒有g(shù)uard這樣的靜態(tài)方法,但是在Facade中有
static::getFacadeRoot()返回一個(gè)對(duì)象
static::getFacadeAccessor()在當(dāng)前的Auth類中重寫
然后再調(diào)用static::resolveFacadeInstance(static::getFacadeAccessor());
首先返回static::$resolvedInstance[$name],如果沒有則將static::$app[$name]賦值給它券犁,在返回
那么static::$app[$name]的當(dāng)前值是什么,在何時(shí)被賦值的呢汹碱?這里暫時(shí)先可以打印一下static::$app['auth']粘衬,看看結(jié)果是什么
注:如果更詳細(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()方法冒掌。
獲取默認(rèn)的驅(qū)動(dòng)
即
最后股毫,調(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()方法
接受一個(gè)$user和$remember參數(shù)悠栓。實(shí)現(xiàn)Session和Cookie機(jī)制霉涨,完成登錄功能