SpringBootSecurity學習(15)先後端分離版之 OAuth2.0簡單示例

OAuth2.0

OAuth 引入了一個受權層,用來分離兩種不一樣的角色:客戶端和資源全部者。客戶端來申請資源,資源全部者贊成之後,資源服務器能夠向客戶端頒發令牌。客戶端經過令牌,去請求數據。也就是說,OAuth 的核心就是向第三方應用頒發令牌。並且,OAuth 2.0 規定了四種得到令牌的流程。你能夠選擇最適合本身的那一種,向第三方應用頒發令牌。html

具體的OAuth學習建議仔細研讀阮一峯的教程,git

  • http://www.ruanyifeng.com/blog/2019/04/oauth_design.html

下面咱們來使用spring cloud security 和 spring cloud oauth2兩個組件來簡單實現受權流程。web

受權服務

下面咱們來使用spring cloud security 實現一個受權服務,首先來引入依賴:redis

file

除了一個web組件,只引入了一個spring-cloud-starter-oauth2,這是由於spring cloud下的oauth2組件已經包含了security:spring

file

首先寫一個正常的登陸功能,application配置文件和啓動類都不用增長特殊配置,主要來配置security配置類:數據庫

file

這裏面基本沒有特殊的配置,都是前面遇到過的熟悉的配置。有了這個配置類,基本的登陸功能就有了,要想有受權功能,還須要一個受權配置類,受權配置類須要繼承 AuthorizationServerConfigurerAdapter 類,並引入 @EnableAuthorizationServer 註解:服務器

file

首先配置一個客戶端:app

file

而後配置token的存儲和管理,此處使用secret做爲祕鑰,後面會介紹使用非對稱加密的方式 :spring-boot

file

上面的token存儲在了內存中,token也能夠存儲在數據庫或者redis中。最後配置受權端點的訪問控制:post

file

以上就是一個簡答的受權服務。

資源服務

下面來搭建一個資源服務,其實受權和資源服務是能夠合二爲一的,此處爲了清晰,將它們分開。pom中引入的依賴和受權服務是同樣的,一樣,配置文件和啓動類不須要作特殊配置。首先來寫兩個簡單的接口,一個定義爲受保護,另外一個不受保護:

file

而後定義一個資源服務配置類,須要繼承 ResourceServerConfigurerAdapter 類,並引入 @EnableResourceServer 註解:

file

首先來看令牌驗證的配置:

file

而後來看接口資源的攔截規則:

file

save開頭的能夠直接訪問,不會被攔截,/user/save接口會被驗證。

注意上面配置的clientId和secret都是單一的配置死的,若是須要對多客戶端動態進行認真,須要重寫,後面是經過http調用的方式解析訪問令牌(主要是經過訪問受權服務的/oauth/check_token解析)。

測試

咱們來根據前面說到的流程測試,首先向受權服務申請一個受權碼:

  • http://localhost:8015/oauth/authorize?client_id=clientId&response_type=code&redirect_uri=http://localhost:8015/

訪問首先會跳轉到登陸頁面:

file

輸入配置中默認的用戶名密碼登陸,而後進入下一個頁面:

file

這個頁面是真正的受權頁面,選擇Approve,點擊按鈕,贊成受權,受權碼會經過回調地址獲取,以下圖:

file

而後攜帶受權碼申請訪問令牌,須要訪問下面的地址(須要使用post方式):

  • http://localhost:8015/oauth/token?grant_type=authorization_code&code=受權碼&redirect_uri=http://localhost:8015/&client_id=clientId&client_secret=secret

將受權碼替換上面地址中的受權碼三個字,而後在postman中訪問:

file

其返回結果中,包含access_token參數,就是咱們須要的訪問令牌,token_type 參數說明了令牌的類型,通常類型爲bearer或者refresh_token能夠在訪問令牌過時後向受權服務申請新的令牌,expires_in參數是令牌的有效時間,單位是秒,圖中顯示默認是12個小時。令牌已經獲得了,下面來訪問資源接口,首先試一下不受保護的資源:

file

能夠看到直接就能訪問,而後訪問受保護的資源接口:

file

獲得這樣的結果說明該接口須要認證,咱們來使用咱們前面獲得的令牌來訪問,首先選擇正確的認真協議:

file

而後在右側填寫前面獲取的access_token:

file

而後訪問接口,就能看到受保護的資源經過令牌能夠訪問:

file

代碼地址 : https://gitee.com/blueses/spring-boot-security 15 和 16

相關文章
相關標籤/搜索