1. 程式人生 > >SpringBootSecurity學習(17)前後端分離版之 OAuth2.0 資料庫(JDBC)儲存客戶端

SpringBootSecurity學習(17)前後端分離版之 OAuth2.0 資料庫(JDBC)儲存客戶端

自動批准授權碼

前面我們授權的流程中,第一步獲取授權碼的時候,都會經歷一個授權是否同意頁面:

這個流程就像第三方登入成功後,提問是否允許獲取暱稱和頭像資訊的頁面一樣,這個過程其實是可以自動同意的,需要在客戶端配置中,增加一個自動批准:

這樣我們申請授權碼直接就可以得到:

在流程需要自動完成的時候,需要這樣配置,如果需要使用者點選同意,那麼這裡需要設定為false,不寫預設也是false。

客戶端資訊整理

上面的自動批准只是客戶端配置中一個小的配置,下面我們來系統整理一下客戶端所有可配置的內容。首先來看現在已經配置的6個欄位:

上面的6個欄位是我們最常用的也是不可或缺的客戶端資訊。不過客戶端的配置還有很多其它的欄位,我們來整體看一下:

上面的11個欄位基本上包括了所有的第三方客戶端的配置內容。下面來一個個詳細講解:

  • withClient 方法:用來配置 client_id ,是必須配置的,用於唯一標識每一個客戶端(client);註冊時必須填寫(也可以服務端自動生成),這個欄位是必須的,實際應用也有叫app_key

  • resourceIds 方法:用來配置resource_ids ,表示客戶端能訪問的資源id集合,註冊客戶端時,根據實際需要可選擇資源id,也可以根據不同的註冊流程,賦予對應的額資源id。我們可以為每一個Resource Server(資源服務)設定一個resourceid。再給client授權的時候,可以設定這個client可以訪問哪一些資源例項,如果沒設定,就是對所有的resource都有訪問許可權。

  • secret 方法:用來配置 client_secret ,註冊填寫或者服務端自動生成,實際應用也有叫app_secret,

  • scopes 方法 :用來配置 scope ,指定client的許可權範圍,比如讀寫許可權,比如移動端還是web端許可權,all表示全部許可權

  • authorizedGrantTypes 方法:用來配置 authorized_grant_types ,可選值, 授權碼模式:authorization_code,密碼模式:password,重新整理token: refresh_token, 隱式模式: implicit: 客戶端模式: client_credentials。支援多個用逗號分隔

  • redirectUris 方法: 用來配置 web_server_redirect_uri ,客戶端重定向uri,authorization_code和implicit需要該值進行校驗,註冊時填寫

  • authorities 方法:用來配置 authorities ,指定使用者的許可權範圍,如果授權的過程需要使用者登陸,該欄位不生效,implicit和client_credentials需要

  • accessTokenValiditySeconds 方法,用來配置 access_token_validity ,設定access_token的有效時間(秒),預設(12小時)

  • refreshTokenValiditySeconds 方法:用來配置 refresh_token_validity ,設定refresh_token有效期(秒),預設(30天)

  • additionalInformation 方法: 用來配置 additional_information ,表示補充資訊,可空,值必須是json格式

  • autoApprove 方法:用來配置autoapprove ,預設false,適用於authorization_code模式,設定使用者是否自動approval操作,設定true跳過使用者確認授權操作頁面,直接跳到redirect_uri

下面我們在資料庫中新建一張表,定義這是十一個欄位,表名為 oauth_client_details:

注意,這裡表名必須是 oauth_client_details 是 oauth規定的表名,也是預設的jdbc操作中的表名。我們來增加一條記錄:

相比前面的例子,這裡多了一個resource_ids的欄位值,其它的都和前面的配置一樣。注意secret儲存的是加密後的密文,加密前是secret。

授權服務多了一個resource_id,資源服務也得配置自己的id:

預設的jdbc管理客戶端

將配置死的客戶端資訊改為jdbc從客戶端查詢的方式很簡單,首先引入資料庫依賴:

然後配置資料來源:

最後修改授權配置類的客戶端配置:

可以看到修改後的客戶端配置很簡單,只需要在客戶端配置一個jdbc資料來源即可,查詢方法是自動實現的。關於實現,可以參考原始碼:

  • org.springframework.security.oauth2.provider.client.JdbcClientDetailsService

裡面有寫好的sql語句和增刪改查邏輯:

其中有個更新祕鑰的方法,是需要加密方式的:

所以我們可以在jdbc方法後面配置加密方式:

測試

上面的除了資料庫,其它的配置修改很簡單,下面來測試一下:

訪問結果:

具體流程和前面一樣。

程式碼地址: https://gitee.com/blueses/spring-boot-security 19