雙Token實現用戶登錄身份認證-Java版

雙Token實現用戶登錄身份認證-Java版

1. 設計方案

方案概述:

  • Access Token: 短期有效的JWT,包含用戶ID設備IDtoken版本號
  • Refresh Token: 長期有效的令牌,存儲于Redis,關聯用戶信息、設備IDtoken版本號,用于刷新Access Token
  • 設備綁定: Token設備ID綁定,防止跨設備使用。
  • 安全性: 用戶修改關鍵信息時遞增token版本號,使舊Token失效。

整個流程大致如下:

  1. 用戶登錄,提供手機號密碼設備ID
  2. 服務端驗證通過后,生成access token(包含userIddeviceIdtokenVersion)和refresh token
  3. refresh token存儲到Redis,key為refresh_token: + refreshToken,值為userIddeviceIdtokenVersion
  4. 客戶端保存雙token,并在請求時攜帶access token設備ID
  5. 攔截器驗證access token的有效性,包括簽名、過期時間、設備ID匹配、tokenVersion是否最新。
  6. access token過期后,客戶端使用refresh token設備ID請求刷新。
  7. 服務端驗證refresh token是否存在,設備ID是否匹配,tokenVersion是否一致,若通過則生成新的access token,Redis中的refresh token不變。
  8. 用戶修改信息時,更新tokenVersion,使所有舊的refresh tokenaccess token失效。
  9. 不同設備的登錄生成不同的refresh token,設備間無法混用,,同時減少token泄露帶來的后續風險。
  10. 用戶退出時,刪除Redis中對應得refresh token

針對各個模塊的代碼實現:

  • JWT工具類:處理生成和解析token,包含tokenVersion
  • 登錄接口:生成雙token,存儲refresh token到Redis。
  • 刷新接口:處理refresh token,生成新的access token
  • 攔截器:驗證access token設備信息。
  • 用戶修改信息:更新tokenVersion

2. 代碼實現

2.1 數據庫用戶信息表結構

在這里插入圖片描述

2.2 JWT工具類

@Getter
@Component
public class AuthJwtUtil {@Value("${auth.jwt.secretKey}")private String secretKey;@Value("${auth.jwt.access.expiration}")private long accessExpirationMs;@Value("${auth.jwt.refresh.expiration}")private long refreshExpirationMs;@Autowiredprivate RedisTemplate<String, Object> redisTemplate;/*** 生成訪問令牌accessToken* @param userId* @param deviceId* @param tokenVersion* @return*/public String generateAccessToken(Long userId, String deviceId, Integer tokenVersion) {return Jwts.builder().claim("userId", userId).claim("deviceId", deviceId).claim("tokenVersion", tokenVersion).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + accessExpirationMs)).signWith(SignatureAlgorithm.HS256, secretKey.getBytes(StandardCharsets.UTF_8)).compact();}/*** 解析訪問令牌* @param token* @return*/public Claims parseAccessToken(String token) {return Jwts.parser().setSigningKey(secretKey.getBytes(StandardCharsets.UTF_8)).parseClaimsJws(token).getBody();}/*** 生成刷新令牌refreshToken* @param userId* @param deviceId* @param tokenVersion* @return*/public String generateRefreshToken(Long userId, String deviceId, Integer tokenVersion) {String refreshToken = UUID.randomUUID().toString();AuthRefreshTokenInfo refreshTokenInfo = AuthRefreshTokenInfo.builder().userId(userId).deviceId(deviceId).tokenVersion(tokenVersion).build();String refreshKey = "refresh_token:" + refreshToken;redisTemplate.opsForValue().set(refreshKey, refreshTokenInfo, Duration.ofMillis(refreshExpirationMs));return refreshToken;}
}

2.3 請求攔截器

@Component
public class AuthInterceptor implements HandlerInterceptor {@Autowiredprivate AuthJwtUtil jwtUtil;@Autowiredprivate AuthService authService;@Overridepublic boolean preHandle(

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/78900.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/78900.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/78900.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Proteus vs Multisim:電路設計與仿真軟件對比

Proteus和Multisim作為兩款主流的電路設計與仿真軟件&#xff0c;在功能定位和應用場景上既有重疊也有顯著差異。以下從多個維度綜合闡述兩者的異同點&#xff1a; 一、相同點 基礎功能 ? 電路原理圖設計&#xff1a;支持電路設計和仿真分析。 ?? 虛擬儀器&#xff1a;提供…

ssh 三級跳

ssh 三級跳 在網絡安全和數據傳輸領域&#xff0c;SSH&#xff08;Secure Shell&#xff09;是一種常用的協議&#xff0c;用于加密兩臺計算機之間的通信。在某些情況下&#xff0c;你可能需要通過一個中間服務器來間接連接到目標服務器&#xff0c;這通常被稱為“三級跳”或“…

Java 性能優化:從原理到實踐的全面指南

性能優化是 Java 開發中不可或缺的一環&#xff0c;尤其在高并發、大數據和分布式系統場景下&#xff0c;優化直接影響系統響應速度、資源利用率和用戶體驗。Java 作為一門成熟的語言&#xff0c;提供了豐富的工具和機制支持性能調優&#xff0c;但優化需要深入理解 JVM、并發模…

【土堆 PyTorch 教程總結】PyTorch入門

目錄 一、python學習中兩大法寶函數 1、dir() 2、help() 二、PyTorch讀取數據集 1、Dataset類 &#xff08;1&#xff09;作用和基本原理 &#xff08;2&#xff09;常見用法 &#xff08;3&#xff09;自定義 Dataset 示例 2、Dataloader類 &#xff08;1&#xff0…

5.DJI-PSDK:Psdk開發負載與Msdk的應用app進行交互:

DJI-PSDK:Psdk開發負載與Msdk的應用app進行交互: 負載設備和無人機使用數據傳輸模塊,在控制命令傳輸通道上以透傳的方式在PSDK和MSDK間傳輸控制指令。在高速數據傳輸通道上以透傳的方式在PSDK和MSDK間傳輸數據信息以及用戶自定義的數據。使用數據傳輸功能,不僅可以設置不同…

2025 藍橋杯省賽c++B組個人題解

聲明 本題解為退役蒻茍所寫&#xff0c;不保證正確性&#xff0c;僅供參考。 花了大概2個半小時寫完&#xff0c;感覺比去年省賽簡單&#xff0c;難度大概等價于 codeforces dv4.5 吧 菜雞不熟悉樹上背包&#xff0c;調了一個多小時 題目旁邊的是 cf 預測分 所有代碼均以通…

Dubbo(53)如何在Spring Boot中集成Dubbo?

在Spring Boot中集成Dubbo可以通過Spring Boot Starter來簡化配置&#xff0c;以下是詳細的步驟和相關代碼示例。 1. 引入依賴 首先&#xff0c;在Spring Boot項目的 pom.xml 中添加Dubbo相關的依賴&#xff1a; <dependencies><!-- Spring Boot Starter --><…

開發一個環保回收小程序需要哪些功能?環保回收小程序

廢品分類展示與識別 詳細分類列表&#xff1a;清晰展示常見廢品類型&#xff0c;如廢紙&#xff08;報紙、書本紙、包裝紙等&#xff09;、塑料&#xff08;塑料瓶、塑料容器、塑料薄膜等&#xff09;、金屬&#xff08;易拉罐、鐵制品、銅制品等&#xff09;、玻璃&#xff0…

抗干擾CAN總線通信技術在分布式電力系統中的應用

摘要&#xff1a;隨著分布式電力系統的廣泛應用&#xff0c;其通信系統的可靠性與穩定性受到了前所未有的挑戰。CAN總線通信技術以其卓越的抗干擾性能和可靠性&#xff0c;在眾多通信技術中脫穎而出&#xff0c;成為解決分布式電力系統通信問題的關鍵。本文深入剖析了CAN總線通…

MySQL與Oracle深度對比

MySQL與Oracle深度對比&#xff1a;數據類型與SQL差異 一、數據類型差異 1. 數值類型對比 數據類型MySQLOracle整數TINYINT, SMALLINT, MEDIUMINT, INT, BIGINTNUMBER(精度) 或直接INT(內部仍為NUMBER)小數DECIMAL(p,s), FLOAT, DOUBLENUMBER(p,s), FLOAT, BINARY_FLOAT, BI…

探索 Rust 語言:高效、安全與并發的完美融合

在當今的編程語言領域&#xff0c;Rust 正以其獨特的魅力吸引著越來越多開發者的目光。它誕生于 Mozilla 實驗室&#xff0c;旨在解決系統編程中長久以來存在的難題&#xff0c;如今已成為構建可靠、高效軟件的有力工具。 1 內存安全 Rust 通過所有權&#xff08;ownership&a…

springboot框架集成websocket依賴實現物聯網設備、前端網頁實時通信!

需求&#xff1a; 最近在對接一個物聯網里設備&#xff0c;他的通信方式是 websocket 。所以我需要在 springboot框架中集成websocket 依賴&#xff0c;從而實現與設備實時通信&#xff01; 框架&#xff1a;springboot2.7 java版本&#xff1a;java8 好了&#xff0c;還是直接…

第八天 開始Unity Shader的學習之Blinn-Phong光照模型

Unity Shader的學習筆記 第八天 開始Unity Shader的學習之Blinn-Phong光照模型 文章目錄 Unity Shader的學習筆記前言一、Blinn-Phong光照模型①計算高光反射部分效果展示 二、召喚神龍:使用Unity內置的函數總結 前言 今天我們編寫另一種高光反射的實現方法 – Blinn光照模型…

React八案例上

代碼下載 技術棧&#xff1a; React 核心庫&#xff1a;react、react-dom、react-router-dom腳手架&#xff1a;create-react-app數據請求&#xff1a;axiosUI組件庫&#xff1a; antd-mobile其他組件庫&#xff1a; react-virtualized、formikyup、react-spring 等百度地圖A…

線代[13]|線性代數題37道以及數學分析題3道(多圖預警)

博主首次發布于CSDN&#xff0c;禁止轉載&#xff01;&#xff08;CSDN&#xff1a;漢密士2025&#xff09; 文章目錄 一、緣起&#xff5c;《俗說矩陣》課程目錄照片存檔&#xff5c;線性代數學習脈絡&#xff5c;線代習題集封面存檔&#xff5c;未來——我與線性代數的糾纏 二…

OpenCV 圖形API(24)圖像濾波-----雙邊濾波函數bilateralFilter()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 應用雙邊濾波到圖像。 該函數對輸入圖像應用雙邊濾波&#xff0c;如 http://www.dai.ed.ac.uk/CVonline/LOCAL_COPIES/MANDUCHI1/Bilateral_Fil…

AI與5G的融合:如何實現更快速、更智能的物聯網應用?

引言 AI和5G的結合&#xff0c;正在加速物聯網&#xff08;IoT&#xff09;應用的發展&#xff0c;讓萬物互聯變得更加智能、高效。5G提供超高速率、低時延和海量連接的網絡能力&#xff0c;而AI則賦予物聯網設備更強的數據分析、預測和自動決策能力。當AI與5G融合&#xff0c;…

在ArcGIS Pro中將柵格NoData值修改為特定值

目錄 問題如下&#xff1a;柵格文件中NoData值為65535&#xff0c;要將該NoData值修改為-9999 步驟一&#xff1a;使用柵格計算器&#xff08;Raster Calculator&#xff09;輸出具有新NoData值的柵格文件 步驟二&#xff1a;輸出修改值后的柵格文件&#xff08;Export Rast…

藍牙連接hci 命令和事件的交互

參考&#xff1a;在HCI層看藍牙的連接過程_hci 獲取藍牙pin碼-CSDN博客 我這邊查看的是core 5.2 一、數據交互流程 1、ACL連接建立后的可選流程 參考藍牙core5.2: vol2 --> PartF --> 4 1.1 AUTHENTICATION REQUESTED Authentication can be explicitly executed at …

【計算機網絡實踐】(十二)大學校園網綜合項目設計

本系列包含&#xff1a; &#xff08;一&#xff09;以太網幀分析與網際互聯協議報文結構分析 &#xff08;二&#xff09;地址解析協議分析與傳輸控制協議特性分析 &#xff08;三&#xff09;交換機的基本操作、配置、 虛擬局域網配置和應用 &#xff08;四&#xff09;交…