中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

發布時間:2021-09-28 09:34:14 來源:億速云 閱讀:189 作者:柒染 欄目:大數據

這篇文章將為大家詳細講解有關SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

內存中存儲token

我們來繼續授權服務代碼的下一個優化。現在授權服務中,token的存儲是存儲在內存中的,我們使用的是 InMemoryTokenStore :

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

圖中的tokenStore方法支持很多種令牌的存儲方式,來看一下:

  • InMemoryTokenStore:這個版本的實現是被默認采用的,它可以完美的工作在單服務器上(即訪問并發量壓力不大的情況下,并且它在失敗的時候不會進行備份),大多數的項目都可以使用這個版本的實現來進行嘗試,你可以在開發的時候使用它來進行管理,因為不會被保存到磁盤中,所以更易于調試。

  • JwtTokenStore:這個版本的全稱是 JSON Web Token(JWT),它可以把令牌相關的數據進行編碼(因此對于后端服務來說,它不需要進行存儲,這將是一個重大優勢),但是它有一個缺點,那就是撤銷一個已經授權令牌將會非常困難,所以它通常用來處理一個生命周期較短的令牌以及撤銷刷新令牌(refresh_token)。另外一個缺點就是這個令牌占用的空間會比較大,如果你加入了比較多用戶憑證信息。JwtTokenStore 不會保存任何數據,但是它在轉換令牌值以及授權信息方面與 DefaultTokenServices 所扮演的角色是一樣的。

  • JdbcTokenStore:這是一個基于JDBC的實現,令牌會被保存進關系型數據庫。使用這個實現時,你可以在不同的服務器之間共享令牌信息,使用的時候請注意把"spring-jdbc"這個依賴加入到你的classpath當中。

  • RedisTokenStore : 這是一個基于Redis的實現,令牌會被保Redis緩存中。使用這個實現時,你可以在不同的服務器之間共享令牌信息,使用的時候請注意把redis依賴加入到你的classpath當中。關于redis和數據庫存儲數據有什么不同和需要注意的地方,這里不再描述。

默認的 InMemoryTokenStore 方式存儲也是可以進行查詢和刪除的,我們來看一下,首先將 InMemoryTokenStore 配置為一個bean:

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

然后配置時調用這個bean:

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

我們來看一下 InMemoryTokenStore 類中對token有哪些操作:

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

從方法的名字可以看出,對token的增刪改查操作基本都是齊全的,我們來寫兩個方法查詢和刪除token:

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

類中注入的InMemoryTokenStore正是前面定義的bean,只有這樣才能操作內存中的token,下面來看一下測試,先根據前面的流程,申請到令牌,然后查詢令牌:

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

然后測試刪除令牌:

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

然后再根據令牌查詢受保護的資源,可以發現無法訪問了。

使用內存的方式雖然基本的功能都在,但是缺點上面也提到了,就是只能工作在單服務器上面,無法默認實現token共享,另外測試環境使用內存存儲也是比較好的選擇。

Redis存儲token

令牌除了可以存儲在內存中,還可以存儲在公共的地方,比如redis中,這樣單服務器數據不同步的問題可以解決。存儲在redis中首先要引入依賴:

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

然后配置數據源:

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

然后修改授權配置類,配置redis存儲的bean:

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

這樣redis存儲token的配置基本就完成了,然后仿照前面的內存存儲操作,寫兩個接口用來查詢和刪除redis中的token:

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

啟動項目,按照之前的流程獲取令牌,訪問保護資源,然后查看redis,可以看到里面存儲了我們獲取的令牌:

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

來看查詢token接口的效果:

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

來看刪除token接口的效果:

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

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

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

只剩下三個刷新的key。

JDBC存儲token

使用jdbc存儲token的方式也可以做到token共享,操作類是 JdbcTokenStore ,我們來看一下這個類:

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

類中定義了好多默認操作的sql語句,總共涉及到兩張表:oauth_access_token和oauth_refresh_token(如果客戶端的grant_type不支持refresh_token,則不會使用該表),來看一下 oauth_access_token 表的結構:

  • token_id:該字段的值是將access_token的值通過MD5加密后存儲的

  • token:存儲將OAuth3AccessToken.java對象序列化后的二進制數據, 是真實的AccessToken的數據值

  • authentication_id:該字段具有唯一性, 其值是根據當前的username(如果有),client_id與scope通過MD5加密生成的. 具體實現請參考DefaultAuthenticationKeyGenerator.java類

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

  • client_id:你懂得

  • authentication:存儲將OAuth3Authentication.java對象序列化后的二進制數據

  • refresh_token :該字段的值是將refresh_token的值通過MD5加密后存儲的

來看一下 oauth_refresh_token 表的字段結構:

  • token_id:該字段的值是將refresh_token的值通過MD5加密后存儲的.

  • token:存儲將OAuth3RefreshToken.java對象序列化后的二進制數據.

  • authentication:存儲將OAuth3Authentication.java對象序列化后的二進制數據

在數據庫中創建這兩張表:

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

然后在pom中引入jdbc依賴,在配置文件中配置數據源,此處不再演示。下一步修改授權配置類:

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

最后仿照前面,寫兩個查詢和刪除token的接口:

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

使用數據庫存儲token,比前面兩種方式多了很多方法和操作,來看 JdbcTokenStore 類:

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

除了增刪改查的操作多了幾個方法,包括sql語句的默認寫法也有覆蓋的set方法。下面來測試,首先按照前面的流程獲取token令牌,然后查詢數據庫:

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

可以看到數據庫中多了兩條token數據,看一下查詢token接口:

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

刪除接口:

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

看一下刪除接口調用的方法源碼:

SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的

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

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

關于SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

梁山县| 资源县| 沙洋县| 安平县| 偃师市| 上饶市| 赣榆县| 房产| 德江县| 德安县| 黄骅市| 鹤峰县| 南召县| 六枝特区| 赣州市| 合江县| 浑源县| 鄱阳县| 西峡县| 新龙县| 鹤庆县| 彝良县| 金川县| 峨眉山市| 宜君县| 皋兰县| 庆安县| 安徽省| 南阳市| 夏邑县| 奉贤区| 无棣县| 友谊县| 玛沁县| 大渡口区| 平乐县| 辽阳市| 隆德县| 云霄县| 中西区| 镇江市|