![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SNldTMxkTZmhTOkJmNhdTN0AjNjFDN3Y2NlNDNzMjN38CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
本文作者:[Java知音] 瑾似流年推薦閱讀 1.
Java 性能優化:教你提高代碼運作的效率
2. 基于token的多平台身份認證架構設計 3.select count(*)底層究竟做了什麼?
4. Springboot啟動原了解析閱讀此文前請先閱讀上一篇SpringBoot整合JWT實作使用者認證了解JWT。
背景介紹:
因項目需求,有PC端 APP端和小程式端,但登陸接口是同一個,然而微服務也無法使用傳統的session解決使用者登入問題(注意這裡是傳統的session不是spring session),使使用者資訊在其他服務共享。
如此一來就想到了token安全認證,而JWT生成token可以包含使用者資訊,也就果斷選擇了JWT作為SpringCloud gateway網關的token校驗工具,這樣,我們便可以直接解析token擷取使用者資訊了。
具體實作思路:
- 讓JWT在其他所有服務可以共同使用,父工程需要引入JWT jar。避免在其他服務重複引入。
- 如何使用JWT生成token。
- 如何解析token。
- 如何讓網關攔截使用者請求校驗token。
- 如何避免首次登入被網關攔截。
代碼實作:
1.建立SpringCloud項目
SpringCloud子項目包含 eureka,gateway,auth三個工程,父工程maven依賴如下。
<dependency>
2.Auth和gateway編寫TOKEN工具類
public
特别提示:以上工具類可以在使用者登入授權接口中調用,用以生成token,示例代碼如下(可以借鑒不可複制哦,請根據自己業務邏輯在合适的地方調用TOKEN工具)
@RestController
好了,此時呢,我們已經通過auth工程完成了使用者登入授權,并且生成了token。那麼如何在gateway網關中進行token認證呢?
3.gateway網關中編寫JwtCheckGatewayFilterFactory過濾器。
此類需要繼承gateway的AbstractGatewayFilterFactory。
代碼實作如下:
首先gateway網關yml檔案中需要代理auth路由。
spring:
cloud:
gateway:
routes:
- id: neo_route
uri: lb://YUNXI-AUTH
predicates:
- Path=/auth/**
filters:
- StripPrefix=1
- JwtCheck
自定義 JwtCheckGatewayFilterFactory 繼承 AbstractGatewayFilterFactory 抽象類,代碼如下:
public
編寫config檔案将JWT認證過濾器添加到Spring bean中。
@Configuration
此時我們就完成了整個token認證過程,其實簡單的來說就是:
- 第一步:Auth工程配合使用者登入生成token,并将token和使用者資訊存儲在redis中。
- 第二步:在gayeway中編寫JWT認證過濾器,用以校驗使用者請求中攜帶的token。
有圖有真相
特别提示:
我的auth工程端口是8766,登入認證接口路由是/currency/login。而此時我請求的認證接口是/main/currency/login,端口是8765,我們在文章開頭就已說明,gateway網關在yml檔案中配置auth代理為auth/,和這裡的main是同一個道理。
如果此時我們再去請求項目中其他端口攜帶過期的token試試看效果:
我們登陸認證傳回的token是:
eyJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsInN0YSI6MTU1NjcxODU2Nzc3NCwiY29tcGFueUlkIjowLCJkZXB0SWQiOjEwMCwidXNlclR5cGUiOm51bGwsImV4cCI6MTU1ODAxNDU2Nzc3NH0.6oXx4Wk-eWHSWTHyJHmoiGowKnAmBdCHIRCzsMq5XlA;
攜帶的其他過期的token是:
eyJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsInN0YSI6MTU1NjQ1NjUwNzIwMiwiY29tcGFueUlkIjowLCJkZXB0SWQiOjEwMCwidXNlclR5cGUiOm51bGwsImV4cCI6MTU1Nzc1MjUwNzIwMn0._yF2TeaR4MTmF-Re9QciMZOeRKBOQmfvi3o4hWeGSMU
再攜帶錯誤的token試試看:
登陸認證傳回的token是:
eyJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsInN0YSI6MTU1NjcxODU2Nzc3NCwiY29tcGFueUlkIjowLCJkZXB0SWQiOjEwMCwidXNlclR5cGUiOm51bGwsImV4cCI6MTU1ODAxNDU2Nzc3NH0.6oXx4Wk-eWHSWTHyJHmoiGowKnAmBdCHIRCzsMq5XlA;
攜帶錯誤的token是:
eyJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsInN0YSI6MTU1NjcxODU2Nzc3NCwiY29tcGFueUlkIjowLCJkZXB0SWQiOjEwMCwidXNlclR5cGUiOm51bGwsImV4cCI6MTU1ODAxNDU2Nzc3NH0.6oXx4Wk-eWHSWTHyJHmoiGowKnAmBdCHIRCzsMq5XlD
攜帶正确的token:
到這裡我麼你的整個SpringCloud gateway網關+JWT安全認證就結束啦,非常抱歉,由于項目保密性不能為大家提供項目源碼。但是整個過程我已經寫的非常詳細,也不希望大家做伸手黨,如果有各種疑問歡迎留言,我可以幫大家一一解決。