天天看點

spring security token 有效期_記一次token安全認證的實踐

spring security token 有效期_記一次token安全認證的實踐
本文作者:[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擷取使用者資訊了。

具體實作思路:

  1. 讓JWT在其他所有服務可以共同使用,父工程需要引入JWT jar。避免在其他服務重複引入。
  2. 如何使用JWT生成token。
  3. 如何解析token。
  4. 如何讓網關攔截使用者請求校驗token。
  5. 如何避免首次登入被網關攔截。

代碼實作:

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。

有圖有真相

spring security token 有效期_記一次token安全認證的實踐

特别提示:

我的auth工程端口是8766,登入認證接口路由是/currency/login。而此時我請求的認證接口是/main/currency/login,端口是8765,我們在文章開頭就已說明,gateway網關在yml檔案中配置auth代理為auth/

,和這裡的main是同一個道理。

如果此時我們再去請求項目中其他端口攜帶過期的token試試看效果:

spring security token 有效期_記一次token安全認證的實踐

我們登陸認證傳回的token是:

eyJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsInN0YSI6MTU1NjcxODU2Nzc3NCwiY29tcGFueUlkIjowLCJkZXB0SWQiOjEwMCwidXNlclR5cGUiOm51bGwsImV4cCI6MTU1ODAxNDU2Nzc3NH0.6oXx4Wk-eWHSWTHyJHmoiGowKnAmBdCHIRCzsMq5XlA;

攜帶的其他過期的token是:

eyJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsInN0YSI6MTU1NjQ1NjUwNzIwMiwiY29tcGFueUlkIjowLCJkZXB0SWQiOjEwMCwidXNlclR5cGUiOm51bGwsImV4cCI6MTU1Nzc1MjUwNzIwMn0._yF2TeaR4MTmF-Re9QciMZOeRKBOQmfvi3o4hWeGSMU

再攜帶錯誤的token試試看:

spring security token 有效期_記一次token安全認證的實踐

登陸認證傳回的token是:

eyJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsInN0YSI6MTU1NjcxODU2Nzc3NCwiY29tcGFueUlkIjowLCJkZXB0SWQiOjEwMCwidXNlclR5cGUiOm51bGwsImV4cCI6MTU1ODAxNDU2Nzc3NH0.6oXx4Wk-eWHSWTHyJHmoiGowKnAmBdCHIRCzsMq5XlA;

攜帶錯誤的token是:

eyJhbGciOiJIUzI1NiJ9.eyJ1aWQiOjEsInN0YSI6MTU1NjcxODU2Nzc3NCwiY29tcGFueUlkIjowLCJkZXB0SWQiOjEwMCwidXNlclR5cGUiOm51bGwsImV4cCI6MTU1ODAxNDU2Nzc3NH0.6oXx4Wk-eWHSWTHyJHmoiGowKnAmBdCHIRCzsMq5XlD

攜帶正确的token:

spring security token 有效期_記一次token安全認證的實踐

到這裡我麼你的整個SpringCloud gateway網關+JWT安全認證就結束啦,非常抱歉,由于項目保密性不能為大家提供項目源碼。但是整個過程我已經寫的非常詳細,也不希望大家做伸手黨,如果有各種疑問歡迎留言,我可以幫大家一一解決。

繼續閱讀