Laravel5.5 - Auth驗(yàn)證流程以及guard守衛(wèi)和自定義驅(qū)動(dòng)driver驅(qū)動(dòng),使用web-token驗(yàn)證

不同認(rèn)證方式

我們先來(lái)看 config/auth.php

  • provider
    • providers 數(shù)組讓我們可以配置一個(gè)提供者,每個(gè)提供者可以選擇不同的 driver.driver可以選擇eloquent 或者 database ,
    • 對(duì)應(yīng)的驅(qū)動(dòng)之后選擇對(duì)應(yīng)的配置項(xiàng),eloquent:model,database:table
  • guard
    • 在擁有provider之后我們可以配置guards 守衛(wèi),守衛(wèi)可以配置一個(gè)驅(qū)動(dòng)者和一個(gè)提供者
    • 提供者就是我們上面配置的provider
    • 而驅(qū)動(dòng)者則有session(session認(rèn)正),token(token認(rèn)正)可供選擇
    • 默認(rèn)api使用的是token認(rèn)正,而web用戶使用session認(rèn)正

session認(rèn)正

  • 在認(rèn)證時(shí)我們可以使用Auth::attempt(['email' => $email, 'password' => $password])方法,此方法在驗(yàn)證成功后會(huì)自動(dòng)為這個(gè)用戶設(shè)置一個(gè)認(rèn)證 Session,標(biāo)識(shí)該用戶登錄成功
  • 后面就可以使用Auth::guard()->check()方式驗(yàn)證用戶是否已經(jīng)登錄

token認(rèn)正

  • 此認(rèn)正方式laravel雖然提供了驅(qū)動(dòng)方法,但是并沒(méi)有默認(rèn)它為驗(yàn)證方式,也沒(méi)有提供自動(dòng)生成token的方法,要使用此方法要自定義login方法

  • 通過(guò)查看底層的\vendor\laravel\framework\src\Illuminate\Auth\TokenGuard.php方法,我們可以發(fā)現(xiàn)laravel5.5底層默認(rèn)的是token字段,我們也可以在此自定義此字段,在此我使用了web_token作為認(rèn)正字段

    1.png

  • 然后我們還要在數(shù)據(jù)庫(kù)里建立相應(yīng)的字段web_token


    2.png

    注:如果使用redis等nosql保存web_token的話也是需要web_token的,為了使laravel自帶的Auth門面可以使用

  • 建立完字段以后就可以寫登錄方法了:


    3.png
  • 在這里還是使用了redis去保存token,便于設(shè)置token的過(guò)期時(shí)間

    • 至于為什么還要保存在數(shù)據(jù)庫(kù)里,在注銷或者token過(guò)期的時(shí)候還要更新數(shù)據(jù)庫(kù)的token,是因?yàn)锳uth底層獲取user的方法是從數(shù)據(jù)庫(kù)進(jìn)行獲取的
    • 貼上源碼來(lái)看一波
  • 首先還是\vendor\laravel\framework\src\Illuminate\Auth\TokenGuard.php文件

    • 這里插一下,如果是想把token放在header頭里傳值,還要在TokenGuard.php加入這一段
      4.png
  • 如果不加入這一段只能從body里面獲取token,頭里傳的token獲取不到,如果是我理解有誤,希望指出

  • 回到原來(lái),我們要說(shuō)Auth::user()方法, 這個(gè)方法會(huì)先實(shí)例化一個(gè)guard守衛(wèi)指定的驅(qū)動(dòng),不指定的話就是默認(rèn)的

  • 可以參考這段代碼\vendor\laravel\framework\src\Illuminate\Auth\AuthManager.php

    5.png

  • 指定的話,就會(huì)去實(shí)例化指定的guard,比如Auth::guard('user')->user()

  • 我們這里默認(rèn)的就是守衛(wèi)adminToken的驅(qū)動(dòng)就是token


    6.png
7.png
  • 當(dāng)我們調(diào)用Auth::user( ) 時(shí)會(huì)調(diào)用\vendor\laravel\framework\src\Illuminate\Auth\TokenGuard.php里的

    8.png

  • 然后我們找到retrieveByCredentials()這個(gè)方法在vendor\laravel\framework\src\Illuminate\Auth\EloquentUserProvider.php

    9.png

  • 可以看出這個(gè)方法用token為條件在elquentModel里查出了一條userObject并返回給了我們

  • 所以我們Auth::user() 得到的user對(duì)象是在model里用token查出來(lái)的,所以如果想使用此功能的話,數(shù)據(jù)庫(kù)里的token字段一定要保持更新

  • 當(dāng)然你也可以拋棄不用,或者改變?cè)创a讓他從redis中取到token和對(duì)應(yīng)的id,再用id去model中取數(shù)據(jù)

  • 這里理解了之后我們?cè)趯懸粋€(gè)middleware用來(lái)驗(yàn)證在訪問(wèn)網(wǎng)站時(shí)token是否正確就行了


    10.png
  • 把新建的middleware加入kernel.php

    11.png

  • 最后在要被驗(yàn)證的方法里的構(gòu)造方法里調(diào)用這個(gè)middleware就可以開(kāi)啟我們得token驗(yàn)證了

  • 如果你有某個(gè)方法不想使用驗(yàn)證, 可以使用except()方法把其排除了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容