您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。
我們來繼續授權服務代碼的下一個優化。現在授權服務中,token的存儲是存儲在內存中的,我們使用的是 InMemoryTokenStore :
圖中的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:
然后配置時調用這個bean:
我們來看一下 InMemoryTokenStore 類中對token有哪些操作:
從方法的名字可以看出,對token的增刪改查操作基本都是齊全的,我們來寫兩個方法查詢和刪除token:
類中注入的InMemoryTokenStore正是前面定義的bean,只有這樣才能操作內存中的token,下面來看一下測試,先根據前面的流程,申請到令牌,然后查詢令牌:
然后測試刪除令牌:
然后再根據令牌查詢受保護的資源,可以發現無法訪問了。
使用內存的方式雖然基本的功能都在,但是缺點上面也提到了,就是只能工作在單服務器上面,無法默認實現token共享,另外測試環境使用內存存儲也是比較好的選擇。
令牌除了可以存儲在內存中,還可以存儲在公共的地方,比如redis中,這樣單服務器數據不同步的問題可以解決。存儲在redis中首先要引入依賴:
然后配置數據源:
然后修改授權配置類,配置redis存儲的bean:
這樣redis存儲token的配置基本就完成了,然后仿照前面的內存存儲操作,寫兩個接口用來查詢和刪除redis中的token:
啟動項目,按照之前的流程獲取令牌,訪問保護資源,然后查看redis,可以看到里面存儲了我們獲取的令牌:
來看查詢token接口的效果:
來看刪除token接口的效果:
刪除后,redis中的token也刪除了:
只剩下三個刷新的key。
使用jdbc存儲token的方式也可以做到token共享,操作類是 JdbcTokenStore ,我們來看一下這個類:
類中定義了好多默認操作的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對象序列化后的二進制數據
在數據庫中創建這兩張表:
然后在pom中引入jdbc依賴,在配置文件中配置數據源,此處不再演示。下一步修改授權配置類:
最后仿照前面,寫兩個查詢和刪除token的接口:
使用數據庫存儲token,比前面兩種方式多了很多方法和操作,來看 JdbcTokenStore 類:
除了增刪改查的操作多了幾個方法,包括sql語句的默認寫法也有覆蓋的set方法。下面來測試,首先按照前面的流程獲取token令牌,然后查詢數據庫:
可以看到數據庫中多了兩條token數據,看一下查詢token接口:
刪除接口:
看一下刪除接口調用的方法源碼:
只是刪除了令牌,更新token的記錄還會保留。
代碼地址: https://gitee.com/blueses/spring-boot-security 23 24
關于SpringBootSecurity中OAuth2.0 token的存儲和管理是怎樣的就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。