一個運行四年之久的項目近期出現用戶AccessToken混淆問題:用戶A登錄后,獲取到的用戶信息卻屬于用戶B。此問題高頻出現,即使清除緩存也無法解決。本文結合spring全家桶、Shiro、redis、mysql8技術棧,分析問題根源并提供解決方案。
提問者已排除redis緩存中token重復以及同一token被不同用戶使用的可能性,說明問題并非token生成沖突或Redis數據異常。他懷疑Shiro未啟用accessToken和refreshToken是否為問題根源。
雖然未啟用accessToken和refreshToken不會直接導致token混淆,但可能與根本原因相關。Shiro框架安全性依賴于Session管理,Session管理漏洞或錯誤配置可能導致不同用戶的Session信息錯誤關聯,從而引發token混淆。
問題核心可能在于token的生成和使用邏輯。提問者使用UUID作為token,雖然UUID碰撞概率極低,但若未進行有效唯一性校驗,則可能導致不同用戶獲得相同token。
因此,關鍵解決方案是在生成并保存token之前,進行唯一性校驗。 在數據庫或Redis中添加字段存儲已使用token,生成新token后,先查詢該字段,若存在則重新生成,直至生成唯一token。
此方法可有效避免token沖突,解決AccessToken混淆問題。需要修改代碼,在token生成邏輯中增加唯一性校驗步驟。 需仔細檢查token生成、存儲和使用流程,確保每個環節正確處理token,避免任何可能導致沖突的情況。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END