最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

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

SpringBoot DEMO代碼:

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

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

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

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

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

2.2 解決JWT自動續(xù)簽有幾個解決方案

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

2.3 解決JWT主動終止問題

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

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

相關(guān)文章

  • Java Scala實現(xiàn)數(shù)據(jù)庫增刪查改操作詳解

    Java Scala實現(xiàn)數(shù)據(jù)庫增刪查改操作詳解

    這篇文章主要介紹了Java Scala實現(xiàn)數(shù)據(jù)庫增刪查改操作,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-04-04
  • Spring Boot分段處理List集合多線程批量插入數(shù)據(jù)的解決方案

    Spring Boot分段處理List集合多線程批量插入數(shù)據(jù)的解決方案

    大數(shù)據(jù)量的List集合,需要把List集合中的數(shù)據(jù)批量插入數(shù)據(jù)庫中,本文給大家介紹Spring Boot分段處理List集合多線程批量插入數(shù)據(jù)的解決方案,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • Java設(shè)計模式之Prototype原型模式

    Java設(shè)計模式之Prototype原型模式

    這篇文章主要為大家詳細(xì)介紹了Java設(shè)計模式之Prototype原型模式的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • Springmvc文件上傳實現(xiàn)流程解析

    Springmvc文件上傳實現(xiàn)流程解析

    這篇文章主要介紹了Springmvc文件上傳實現(xiàn)流程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • java異常處理機(jī)制示例(java拋出異常、捕獲、斷言)

    java異常處理機(jī)制示例(java拋出異常、捕獲、斷言)

    這篇文章主要介紹了java異常處理機(jī)制示例(java拋出異常、捕獲、斷言),需要的朋友可以參考下
    2014-05-05
  • 基于Java編寫一個粽子大作戰(zhàn)小游戲

    基于Java編寫一個粽子大作戰(zhàn)小游戲

    端午節(jié),又稱龍舟節(jié)、重午節(jié),是中國的傳統(tǒng)節(jié)日之一,每年農(nóng)歷五月初五慶祝,雖然端午假期已經(jīng)過去了,小編還是用Java編寫了一個粽子大作戰(zhàn)小游戲,感興趣的可以了解一下
    2023-06-06
  • java網(wǎng)絡(luò)之基于UDP的聊天程序示例解析

    java網(wǎng)絡(luò)之基于UDP的聊天程序示例解析

    這篇文章主要介紹了java網(wǎng)絡(luò)之基于UDP的聊天程序示例解析,文中通過步驟及示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • idea在plugins中搜不到插件的解決方法

    idea在plugins中搜不到插件的解決方法

    本文主要介紹了idea在plugins中搜不到插件的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • Java中Comparator與Comparable排序的區(qū)別詳解

    Java中Comparator與Comparable排序的區(qū)別詳解

    這篇文章主要介紹了Java中Comparator與Comparable排序的區(qū)別詳解,如果你有一個類,希望支持同類型的自定義比較策略,可以實現(xiàn)接口Comparable,如果某個類,沒有實現(xiàn)Comparable,但是又希望對它進(jìn)行比較,則可以自定義一個Comparator,需要的朋友可以參考下
    2024-01-01
  • JAVA錯誤類結(jié)果類和分頁結(jié)果類代碼詳解

    JAVA錯誤類結(jié)果類和分頁結(jié)果類代碼詳解

    這篇文章主要介紹了JAVA錯誤類結(jié)果類和分頁結(jié)果類代碼詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02

最新評論

双峰县| 南皮县| 文昌市| 连州市| 息烽县| 铜川市| 阿拉尔市| 陆良县| 榆中县| 曲麻莱县| 扎鲁特旗| 如东县| 鹿泉市| 鄂温| 大姚县| 望都县| 临安市| 台中市| 河北省| 四川省| 十堰市| 平陆县| 重庆市| 胶州市| 大名县| 博野县| 利川市| 济南市| 兰州市| 松阳县| 绿春县| 临漳县| 万安县| 思茅市| 京山县| 迁西县| 苍南县| 永善县| 万安县| 万盛区| 华宁县|