溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

發(fā)布時(shí)間:2021-09-28 09:34:14 來(lái)源:億速云 閱讀:176 作者:柒染 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

內(nèi)存中存儲(chǔ)token

我們來(lái)繼續(xù)授權(quán)服務(wù)代碼的下一個(gè)優(yōu)化?,F(xiàn)在授權(quán)服務(wù)中,token的存儲(chǔ)是存儲(chǔ)在內(nèi)存中的,我們使用的是 InMemoryTokenStore :

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

圖中的tokenStore方法支持很多種令牌的存儲(chǔ)方式,來(lái)看一下:

  • InMemoryTokenStore:這個(gè)版本的實(shí)現(xiàn)是被默認(rèn)采用的,它可以完美的工作在單服務(wù)器上(即訪問(wèn)并發(fā)量壓力不大的情況下,并且它在失敗的時(shí)候不會(huì)進(jìn)行備份),大多數(shù)的項(xiàng)目都可以使用這個(gè)版本的實(shí)現(xiàn)來(lái)進(jìn)行嘗試,你可以在開(kāi)發(fā)的時(shí)候使用它來(lái)進(jìn)行管理,因?yàn)椴粫?huì)被保存到磁盤(pán)中,所以更易于調(diào)試。

  • JwtTokenStore:這個(gè)版本的全稱(chēng)是 JSON Web Token(JWT),它可以把令牌相關(guān)的數(shù)據(jù)進(jìn)行編碼(因此對(duì)于后端服務(wù)來(lái)說(shuō),它不需要進(jìn)行存儲(chǔ),這將是一個(gè)重大優(yōu)勢(shì)),但是它有一個(gè)缺點(diǎn),那就是撤銷(xiāo)一個(gè)已經(jīng)授權(quán)令牌將會(huì)非常困難,所以它通常用來(lái)處理一個(gè)生命周期較短的令牌以及撤銷(xiāo)刷新令牌(refresh_token)。另外一個(gè)缺點(diǎn)就是這個(gè)令牌占用的空間會(huì)比較大,如果你加入了比較多用戶(hù)憑證信息。JwtTokenStore 不會(huì)保存任何數(shù)據(jù),但是它在轉(zhuǎn)換令牌值以及授權(quán)信息方面與 DefaultTokenServices 所扮演的角色是一樣的。

  • JdbcTokenStore:這是一個(gè)基于JDBC的實(shí)現(xiàn),令牌會(huì)被保存進(jìn)關(guān)系型數(shù)據(jù)庫(kù)。使用這個(gè)實(shí)現(xiàn)時(shí),你可以在不同的服務(wù)器之間共享令牌信息,使用的時(shí)候請(qǐng)注意把"spring-jdbc"這個(gè)依賴(lài)加入到你的classpath當(dāng)中。

  • RedisTokenStore : 這是一個(gè)基于Redis的實(shí)現(xiàn),令牌會(huì)被保Redis緩存中。使用這個(gè)實(shí)現(xiàn)時(shí),你可以在不同的服務(wù)器之間共享令牌信息,使用的時(shí)候請(qǐng)注意把redis依賴(lài)加入到你的classpath當(dāng)中。關(guān)于redis和數(shù)據(jù)庫(kù)存儲(chǔ)數(shù)據(jù)有什么不同和需要注意的地方,這里不再描述。

默認(rèn)的 InMemoryTokenStore 方式存儲(chǔ)也是可以進(jìn)行查詢(xún)和刪除的,我們來(lái)看一下,首先將 InMemoryTokenStore 配置為一個(gè)bean:

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

然后配置時(shí)調(diào)用這個(gè)bean:

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

我們來(lái)看一下 InMemoryTokenStore 類(lèi)中對(duì)token有哪些操作:

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

從方法的名字可以看出,對(duì)token的增刪改查操作基本都是齊全的,我們來(lái)寫(xiě)兩個(gè)方法查詢(xún)和刪除token:

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

類(lèi)中注入的InMemoryTokenStore正是前面定義的bean,只有這樣才能操作內(nèi)存中的token,下面來(lái)看一下測(cè)試,先根據(jù)前面的流程,申請(qǐng)到令牌,然后查詢(xún)令牌:

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

然后測(cè)試刪除令牌:

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

然后再根據(jù)令牌查詢(xún)受保護(hù)的資源,可以發(fā)現(xiàn)無(wú)法訪問(wèn)了。

使用內(nèi)存的方式雖然基本的功能都在,但是缺點(diǎn)上面也提到了,就是只能工作在單服務(wù)器上面,無(wú)法默認(rèn)實(shí)現(xiàn)token共享,另外測(cè)試環(huán)境使用內(nèi)存存儲(chǔ)也是比較好的選擇。

Redis存儲(chǔ)token

令牌除了可以存儲(chǔ)在內(nèi)存中,還可以存儲(chǔ)在公共的地方,比如redis中,這樣單服務(wù)器數(shù)據(jù)不同步的問(wèn)題可以解決。存儲(chǔ)在redis中首先要引入依賴(lài):

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

然后配置數(shù)據(jù)源:

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

然后修改授權(quán)配置類(lèi),配置redis存儲(chǔ)的bean:

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

這樣redis存儲(chǔ)token的配置基本就完成了,然后仿照前面的內(nèi)存存儲(chǔ)操作,寫(xiě)兩個(gè)接口用來(lái)查詢(xún)和刪除redis中的token:

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

啟動(dòng)項(xiàng)目,按照之前的流程獲取令牌,訪問(wèn)保護(hù)資源,然后查看redis,可以看到里面存儲(chǔ)了我們獲取的令牌:

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

來(lái)看查詢(xún)token接口的效果:

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

來(lái)看刪除token接口的效果:

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

刪除后,redis中的token也刪除了:

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

只剩下三個(gè)刷新的key。

JDBC存儲(chǔ)token

使用jdbc存儲(chǔ)token的方式也可以做到token共享,操作類(lèi)是 JdbcTokenStore ,我們來(lái)看一下這個(gè)類(lèi):

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

類(lèi)中定義了好多默認(rèn)操作的sql語(yǔ)句,總共涉及到兩張表:oauth_access_token和oauth_refresh_token(如果客戶(hù)端的grant_type不支持refresh_token,則不會(huì)使用該表),來(lái)看一下 oauth_access_token 表的結(jié)構(gòu):

  • token_id:該字段的值是將access_token的值通過(guò)MD5加密后存儲(chǔ)的

  • token:存儲(chǔ)將OAuth3AccessToken.java對(duì)象序列化后的二進(jìn)制數(shù)據(jù), 是真實(shí)的AccessToken的數(shù)據(jù)值

  • authentication_id:該字段具有唯一性, 其值是根據(jù)當(dāng)前的username(如果有),client_id與scope通過(guò)MD5加密生成的. 具體實(shí)現(xiàn)請(qǐng)參考DefaultAuthenticationKeyGenerator.java類(lèi)

  • user_name:登錄時(shí)的用戶(hù)名, 若客戶(hù)端沒(méi)有用戶(hù)名(如grant_type="client_credentials"),則該值等于client_id

  • client_id:你懂得

  • authentication:存儲(chǔ)將OAuth3Authentication.java對(duì)象序列化后的二進(jìn)制數(shù)據(jù)

  • refresh_token :該字段的值是將refresh_token的值通過(guò)MD5加密后存儲(chǔ)的

來(lái)看一下 oauth_refresh_token 表的字段結(jié)構(gòu):

  • token_id:該字段的值是將refresh_token的值通過(guò)MD5加密后存儲(chǔ)的.

  • token:存儲(chǔ)將OAuth3RefreshToken.java對(duì)象序列化后的二進(jìn)制數(shù)據(jù).

  • authentication:存儲(chǔ)將OAuth3Authentication.java對(duì)象序列化后的二進(jìn)制數(shù)據(jù)

在數(shù)據(jù)庫(kù)中創(chuàng)建這兩張表:

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

然后在pom中引入jdbc依賴(lài),在配置文件中配置數(shù)據(jù)源,此處不再演示。下一步修改授權(quán)配置類(lèi):

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

最后仿照前面,寫(xiě)兩個(gè)查詢(xún)和刪除token的接口:

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

使用數(shù)據(jù)庫(kù)存儲(chǔ)token,比前面兩種方式多了很多方法和操作,來(lái)看 JdbcTokenStore 類(lèi):

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

除了增刪改查的操作多了幾個(gè)方法,包括sql語(yǔ)句的默認(rèn)寫(xiě)法也有覆蓋的set方法。下面來(lái)測(cè)試,首先按照前面的流程獲取token令牌,然后查詢(xún)數(shù)據(jù)庫(kù):

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

可以看到數(shù)據(jù)庫(kù)中多了兩條token數(shù)據(jù),看一下查詢(xún)token接口:

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

刪除接口:

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

看一下刪除接口調(diào)用的方法源碼:

SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的

只是刪除了令牌,更新token的記錄還會(huì)保留。

代碼地址: https://gitee.com/blueses/spring-boot-security 23 24

關(guān)于SpringBootSecurity中OAuth2.0 token的存儲(chǔ)和管理是怎樣的就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI