欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot中Token登錄授權(quán)、續(xù)期和主動(dòng)終止的方案流程分析

 更新時(shí)間:2024年09月24日 16:36:39   作者:碼到三十五  
SpringBoot項(xiàng)目中,基于Token的登錄授權(quán)方案主要有兩種:利用Session/Cookie和JWT,Cookie/Session方案有狀態(tài),不適合分布式架構(gòu),而JWT雖無狀態(tài),但存在過期時(shí)間不可強(qiáng)制失效、一次性等缺點(diǎn),本文介紹SpringBoot中Token登錄授權(quán)、續(xù)期和主動(dòng)終止的方案,感興趣的朋友一起看看吧

SpringBoot項(xiàng)目要寫登錄注冊(cè)之類的方案
使用Cookie或Session的話,它是有狀態(tài)的,不符合分布式技術(shù)架構(gòu)
使用Security或者Shiro框架實(shí)現(xiàn)起來比較復(fù)雜,一般項(xiàng)目無需用那么復(fù)雜
使用JWT它雖然是無狀態(tài)的,也可以載荷用戶數(shù)據(jù),但還是有很多缺點(diǎn):
- 缺點(diǎn)1:設(shè)置過期時(shí)間后,無法強(qiáng)制讓它過期,在有效期內(nèi)它始終可用
- 缺點(diǎn)2:一次性的,如果用戶數(shù)據(jù)有變,只能重新生成新的JWT

以前登錄Token一般是放在服務(wù)端的Session中,Session有過期時(shí)間,也會(huì)自動(dòng)延期,當(dāng)然我們現(xiàn)在絕大部分項(xiàng)目都不會(huì)使用session來存儲(chǔ)了。

1、Redis+Token方案的授權(quán)流程

SpringBoot用普通的UUID作為token,返回到前端后,前端每次請(qǐng)求都會(huì)帶上這個(gè)token作為授權(quán)憑證。這種方案是能夠自動(dòng)續(xù)簽,也能做到主動(dòng)終止。所以很多項(xiàng)目用的都是Redis+Token方案,簡(jiǎn)單方便問題少。缺點(diǎn)就是需要依賴Redis和數(shù)據(jù)庫。

流程 + lua優(yōu)化 :

  • 設(shè)置一個(gè)攔截器,不校驗(yàn)登錄接口,攔截其他接口
  • 登錄接口接收前端傳來的用戶名密碼,去數(shù)據(jù)庫查詢?cè)撚脩裘欠翊嬖冢撁艽a是否正確
  • 如果正確則表示登錄成功,調(diào)用生成Token方法,返回Token給前端
  • Token使用用戶id或賬號(hào)+時(shí)間戳+UUID用MD5加密的一串字符串(不建議用其他數(shù)據(jù),因?yàn)閕d或賬號(hào)極少變更的,變更會(huì)增加復(fù)雜性)
  • 生成后存儲(chǔ)到Redis,把Token當(dāng)作鍵,用戶數(shù)據(jù)當(dāng)作值,并設(shè)置過期時(shí)間
  • 生成Token的方法中,還得防止重復(fù)調(diào)登錄接口,不停生成不同的Token,所以先判斷數(shù)據(jù)庫中是否存在鍵,所以保存token鍵到redis的同時(shí)要在redis中再增加一條用戶ID為鍵Token為值的數(shù)據(jù),可以驗(yàn)證該用戶是否已經(jīng)生成過token

SpringBoot DEMO代碼:

接下來是校驗(yàn)其他接口方法,同時(shí)也做了驗(yàn)證和續(xù)期

2、JWT方案的的授權(quán)流程

2.1 JWT帶來的續(xù)簽和終止問題

JWT的優(yōu)勢(shì)在于無狀態(tài),也就是生成的Token中本身有存儲(chǔ)信息,所以不需要依賴Redis和DB。JWT本身也有有效期參與簽名,問題在于這個(gè)有效期不能更改,也很好理解如果參與簽名的參數(shù)(有效期)發(fā)生變化,Token也就不一樣了。如果有效期不能改變,即便時(shí)間設(shè)計(jì)的再長(zhǎng),也會(huì)有到期的時(shí)候,而且Token這種設(shè)計(jì)初衷也不能有效期很長(zhǎng),導(dǎo)致用戶在操作過程中Token到期授權(quán)失敗,這種情況根本是無法接受的。

另外,JWT的Token簽發(fā)之后,理論上在到期之前是始終有效的,在有些場(chǎng)景下,比如用戶更改/重置密碼,踢出登錄(單一用戶登錄),都需要讓對(duì)應(yīng)用戶在其他電腦(終端)上自動(dòng)退出登錄,也就是要讓其他的Token馬上失效,所以需要額外設(shè)計(jì)來解決這兩個(gè)問題。

2.2 解決JWT自動(dòng)續(xù)簽有幾個(gè)解決方案

  • 每次請(qǐng)求都返回新的Token,這種簡(jiǎn)單粗暴,不存在續(xù)簽的問題,不過相信很多人不會(huì)用,請(qǐng)求量大的話性能損耗也是比較明顯。
  • 生成的JWT,不加入過期時(shí)間,在服務(wù)端Redis額外存儲(chǔ)一個(gè)對(duì)應(yīng)的過期時(shí)間,并每次操作延期。這種設(shè)計(jì)感覺很多余,既然保存到了Redis,JWT從無狀態(tài)變成了有狀態(tài),既然能夠保存過期時(shí)間,為啥不把用戶信息都保存到Redis中,何必用JWT加密后前后端傳來傳去沒有意義。
  • 臨近過期刷新JWT,返回新的Token,很多人也采用的是這種方案。

2.3 解決JWT主動(dòng)終止問題

  • JWT簽發(fā)后就生效,無法做到主動(dòng)終止,那還是用到Redis,把用戶id作為key,生成一個(gè)用戶唯一ID(用戶指紋)存入Redis,并參與JWT簽發(fā)過程;
  • 如果更改了密碼需要終止其他所有已經(jīng)簽發(fā)的JWT,只需要更改這個(gè)用戶指紋;
  • 在JWT驗(yàn)簽過程中,驗(yàn)證用戶指紋,如果和JWT中信息不一致授權(quán)失敗,也就是做到了主動(dòng)終止JWT的目的。
  • 需要注意的是,在高并發(fā)過程中寫入用戶指紋過程可能要用到分布式鎖。

到此這篇關(guān)于SpringBoot中Token登錄授權(quán)、續(xù)期和主動(dòng)終止的方案的文章就介紹到這了,更多相關(guān)SpringBoot Token登錄授權(quán)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 在Java和Java Web中放置圖片、視頻、音頻、圖像文件的方法

    在Java和Java Web中放置圖片、視頻、音頻、圖像文件的方法

    在Java軟件中放置圖片,通常涉及將圖片文件(如JPEG、PNG等)作為資源包含在我們的項(xiàng)目中,并在代碼中通過適當(dāng)?shù)姆绞揭眠@些資源,這可以通過多種方式實(shí)現(xiàn),但最常見的是在Java桌面應(yīng)用(如Swing或JavaFX)或Web應(yīng)用(如Servlet/JSP)中
    2024-11-11
  • SpringBoot集成Kafka的實(shí)現(xiàn)示例

    SpringBoot集成Kafka的實(shí)現(xiàn)示例

    本文主要介紹了SpringBoot集成Kafka的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • Java從控制臺(tái)接受輸入字符的簡(jiǎn)單方法

    Java從控制臺(tái)接受輸入字符的簡(jiǎn)單方法

    這篇文章主要介紹了Java從控制臺(tái)接受輸入字符的簡(jiǎn)單方法,需要的朋友可以參考下
    2014-02-02
  • java實(shí)現(xiàn)手寫一個(gè)簡(jiǎn)單版的線程池

    java實(shí)現(xiàn)手寫一個(gè)簡(jiǎn)單版的線程池

    有些人可能對(duì)線程池比較陌生,并且更不熟悉線程池的工作原理。本文就來手寫一個(gè)簡(jiǎn)單版的線程池,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Java枚舉_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    Java枚舉_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    enum 的全稱為 enumeration, 是 JDK 5 中引入的新特性,存放在 java.lang 包中。這篇文章給大家介紹Java枚舉相關(guān)知識(shí),需要的的朋友參考下
    2017-04-04
  • 詳解MyBatis如何在大數(shù)據(jù)量下使用流式查詢進(jìn)行數(shù)據(jù)同步

    詳解MyBatis如何在大數(shù)據(jù)量下使用流式查詢進(jìn)行數(shù)據(jù)同步

    通常的數(shù)據(jù)同步中,如果數(shù)據(jù)量比較少的話可以直接全量同步,但是如果數(shù)據(jù)量很大的話,全量同步需要大量的內(nèi)存,所以本文為大家介紹了MyBatis使用流式查詢實(shí)現(xiàn)數(shù)據(jù)同步的方法,希望對(duì)大家有所幫助
    2023-05-05
  • spring boot在啟動(dòng)項(xiàng)目之后執(zhí)行的實(shí)現(xiàn)方法

    spring boot在啟動(dòng)項(xiàng)目之后執(zhí)行的實(shí)現(xiàn)方法

    在開發(fā)時(shí)有時(shí)候需要在整個(gè)應(yīng)用開始運(yùn)行時(shí)執(zhí)行一些特定代碼,比如初始化環(huán)境,下面這篇文章就來給大家介紹了關(guān)于spring boot在啟動(dòng)項(xiàng)目之后執(zhí)行自己要執(zhí)行的東西的實(shí)現(xiàn)方法,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考下。
    2017-09-09
  • Java中Collection和Collections的區(qū)別

    Java中Collection和Collections的區(qū)別

    Collection是一個(gè)集合接口,集合類的頂級(jí)接口,Collections是一個(gè)包裝類,本文主要介紹了Java中Collection和Collections的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-04-04
  • java虛擬機(jī)原理:類加載過程詳解

    java虛擬機(jī)原理:類加載過程詳解

    這篇文章主要介紹了Java中類加載過程全面解析,具有一定參考價(jià)值,需要的朋友可以了解下,希望能夠給你帶來幫助
    2021-09-09
  • Spring事務(wù)傳播行為問題解決

    Spring事務(wù)傳播行為問題解決

    這篇文章主要介紹了Spring事務(wù)傳播行為問題解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01

最新評(píng)論