摘要:如何做用戶認證根據(jù)文檔描述,提供用戶認證的接口,他的核心是看守器和提供器,看守器定義怎么認證用戶,提供器定義怎么檢索用戶。
最近的一個PHP項目,上一個項目是采用ThinkPHP來弄的,因為很早就聽說過Laravel的大名,所以進了Laravel的官網(wǎng),意外發(fā)現(xiàn)了Lumen,正好我項目是提供API的,所以選擇了Lumen,因為是Laravel的精簡版,看了幾天的Laravel文檔,也總結(jié)出了自己的一些經(jīng)驗,不權(quán)威:
1、Larave的核心是服務(wù)容器,服務(wù)容器的主要功能是依賴注入
2、Laravel的各部分功能以組件形式提供,需要什么注入什么
下面進入正題JWT認證,感謝學(xué)習(xí) Lumen 用戶認證 (二) —— 使用 jwt-auth 插件這篇文章對我的幫助。
如何做用戶認證?
根據(jù)Laravel文檔描述,Laravel提供用戶認證的接口,他的核心是看守器(Guard)和提供器(Provider),看守器定義怎么認證用戶,提供器定義怎么檢索用戶。
首先創(chuàng)建項目lumen new jwt-demo,然后進入jwt-demo目錄,執(zhí)行composer require tymon/jwt-auth:1.0.0-rc.2,在項目根目錄下創(chuàng)建config文件夾,并將vender/laravel中的auth.php拷貝到config目錄下,auth.php文件內(nèi)容如下:
然后修改boostrap/app.php文件,添加如下配置
修改路由文件routers/web.php
一定要使用jwt.auth中間件,然后在Controllers目錄下新建App/AuthController.php文件,文件內(nèi)容如下:
修改app/Exceptions/Handler.php文件
然后瀏覽器訪問域名/auth/home,結(jié)果如下:
那么現(xiàn)在從源碼看一下401是怎么來的?
這里定義了這個路由,要經(jīng)過jwt.auth這個中間件,下一步這個中間件在哪里定義的呢,
可以看到在LumenServiceProvider中有$this->app->routeMiddleware($this->middlewareAlias)這么一句,
可以看到在這里是定義了一個名為jwt.auth的路由中間件,對應(yīng)TymonJWTAuthHttpMiddlewareAuthenticate這個類,看一下這個類的實現(xiàn)
可以看到是通過$this->authenticate這個方法進行驗證的,那么現(xiàn)在看下這個方法的實現(xiàn)
可以看到這里有兩個方法,checkForToken用來驗證是否存在token,如果不存在則拋出異常,如果存在則進入$this->auth->parseToken()->authenticate()用來驗證token是否合法,怎么驗證token是否存在這里不做討論,我們來看下他是怎么驗證token是否合法的,跟蹤代碼發(fā)現(xiàn)執(zhí)行的事JWTAuth類的下面方法
可以看到首先從payload中獲得id值,然后通過id檢索用戶,如果檢索成功,返回false,token不合法,否則返回檢索到的用戶,token合法,那么跟蹤一下檢索用戶的代碼,最終進入的是JWTGuard類的如下方法
$this->provider就是我們在config/auth.php中配置的
eloquent,對應(yīng)的類是EloquentUserProvider,我們看下它的retrieveById方法,實現(xiàn)如下
這里就已經(jīng)在從數(shù)據(jù)庫中查找用戶,在實際研發(fā)中對于數(shù)據(jù)庫的查找我們可能有自己的邏輯,那么我們只能去實現(xiàn)我們自己的Provider然后去替換掉JWTGuard中的Provider,那么這一步該怎么做呢?
在bootstrap/app.php有這么一句$app->register(TymonJWTAuthProvidersLumenServiceProvider::class);,我們可以看下LumenServiceProvider的源碼,可以看到有這么一個方法,我們可以去看下他的實現(xiàn),
可以看到這里傳入了Provider,那么我們看一下AuthManager的createUserProvider方法
程序會先去讀取Provider的配置信息,也就是auth.php中的
這么一部分,然后判斷customProviderCreators中是否存在對應(yīng)的Guard的驅(qū)動,如果存在則根據(jù)驅(qū)動創(chuàng)建用戶自定義Provider,否則判斷driver是否為datebase或者eloquent,如果也不成立則拋出異常,否則創(chuàng)建DatebaseProvider或者EloquentProvider,那么根據(jù)這么一段代碼,我們只需要在auth.php配置好自己的驅(qū)動,然后將我們自己的Provider實現(xiàn)類注入到customProviderCreators去就可以了,那么怎么注入呢,在AuthManager中有這么一個方法
至此如何自定義Provider就解決了,現(xiàn)在就來實戰(zhàn)一下,自定義的Provider代碼如下,
參照EloquentUserProvider和DatebaseUserProvider可知需要實現(xiàn)UserProvider接口,為了方便,我就直接繼承DatebaseUserProvider了,重寫了retrieveById方法,默認返回true,首先修改auth.php中的provider的driver為my,然后就是注入MyJWTUserProvider了,在app/Jwt目錄下新建一個MyLumenServiceProvider,代碼如下
最后將boostrap/app.php中register的LumenServiceProvider改為MyLumenServiceProvider
至此JWT還剩下一個生成用戶驗證返回token的過程
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/28722.html
摘要:在開發(fā)中,用戶認證是核心,是數(shù)據(jù)是否有保障的前提,目前主要有兩種常用方式進行用戶認證和。附是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于的開放標準。 好久沒寫 PHP 代碼了,尤其是 Lumen,我是 Lumen 的忠實用戶,自從面世開始,我就將 Lumen 作為我 API 的主要框架使用。 但說到 API,不得不說的一個概念:「前后端分離」,現(xiàn)在越來越多的團隊都采用前后端分離,徹底解...
摘要:在開發(fā)中,用戶認證是核心,是數(shù)據(jù)是否有保障的前提,目前主要有兩種常用方式進行用戶認證和。為了學(xué)習(xí)在中的使用,最好的辦法就是在程序員同志網(wǎng)搜索有關(guān)插件,找個最多的那個拿來研究研究。 通過上一篇《學(xué)習(xí) Lumen 用戶認證 (一)》https://mp.weixin.qq.com/s/KVUQE2DUetNB2kqxHs0VDg的學(xué)習(xí),大致懂了 Lumen 的用戶認證主要使用 「api」的...
摘要:擴展用戶認證系統(tǒng)上一節(jié)我們介紹了系統(tǒng)實現(xiàn)的一些細節(jié)知道了是如何應(yīng)用看守器和用戶提供器來進行用戶認證的,但是針對我們自己開發(fā)的項目或多或少地我們都會需要在自帶的看守器和用戶提供器基礎(chǔ)之上做一些定制化來適應(yīng)項目,本節(jié)我會列舉一個在做項目時遇到的 擴展用戶認證系統(tǒng) 上一節(jié)我們介紹了Laravel Auth系統(tǒng)實現(xiàn)的一些細節(jié)知道了Laravel是如何應(yīng)用看守器和用戶提供器來進行用戶認證的,但是...
摘要:現(xiàn)在的提供了一種更易于使用和維護的計劃任務(wù)方式。注意事項建議開啟這樣會極大的加速類的加載。 lumen 為速度而生的 Laravel 框架 官網(wǎng)的介紹很簡潔,而且 lumen 確實也很簡單,我在調(diào)研了 lumen 相關(guān)組件(比如緩存,隊列,校驗,路由,中間件和最重要的容器)之后認為已經(jīng)能夠滿足我目前這個微服務(wù)的需求了。 任務(wù)目標 showImg(https://segmentfault...
摘要:框架具有輕便,開源的優(yōu)點,所以本譯見構(gòu)建用戶管理微服務(wù)五使用令牌和來實現(xiàn)身份驗證往期譯見系列文章在賬號分享中持續(xù)連載,敬請查看在往期譯見系列的文章中,我們已經(jīng)建立了業(yè)務(wù)邏輯數(shù)據(jù)訪問層和前端控制器但是忽略了對身份進行驗證。 重拾后端之Spring Boot(四):使用JWT和Spring Security保護REST API 重拾后端之Spring Boot(一):REST API的搭建...
閱讀 3325·2021-11-18 10:02
閱讀 3473·2021-10-11 10:58
閱讀 3399·2021-09-24 09:47
閱讀 1180·2021-09-22 15:21
閱讀 4037·2021-09-10 11:10
閱讀 3303·2021-09-03 10:28
閱讀 1775·2019-08-30 15:45
閱讀 2173·2019-08-30 14:22