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