1. 程式人生 > >Spring cloud oauth2.0的原始碼解析與實踐Demo

Spring cloud oauth2.0的原始碼解析與實踐Demo

一、原始碼程式碼介紹

上一篇已經大致介紹了一下Spring cloud oauth2.0,點此檢視上一篇,現在再來大致分析一下它的原始碼結構,Spring cloud oauth2.0的程式碼結構圖如下:


可以看到Spring oauth2.0的程式碼結構分為了五層,client層負責應用客戶端的管理。common層為公共類的所在地。config層為配置層。http.converter層為轉換層。provider層是最重要的一層,它負責管理認證伺服器和資源伺服器。下面大致介紹每一層,歡迎一起討論:

1.client層:如圖


這裡只講其中的幾個比較典型的類:

(1)OAuth2ClientAuthenticationProcessingFilter:負責對客戶端的訪問進行過濾,驗證token處理等操作。

(2)JdbcClientTokenServices:裡面封裝了對oauth_client_token表的一系列操作(如增刪改查),此表儲存的是此client的token資訊。

(3)OAuth2RestTemplate:實現了OAuthRestOperations介面,主要是用來去呼叫受保護資源,會自己帶上當前的token資訊。

當然還有其它的一些類,比如DefaultOAuth2ClientContext實現了OAuth2ClientContext介面,裡面儲存了client的上下文資訊。

2.common公共層:如圖


可見這一層主要是對json字串處理、解析和例項化等操作,

3.config層:

註解的定義,以及認證伺服器和資源伺服器的各個配置類的定義都在這個包,是貫穿整個程式碼非常核心的一層。如圖:


可見,我們在程式碼裡所用的三個基本註解EnableAuthorizationServer、EnableOAuth2Client、EnableResourceServer都在這裡。還有

AuthorizationServerConfigurerAdapter、ResourceServerConfigurerAdapter這兩個最核心的配置類也在這裡,只要實現這兩個核心配置類,複寫他們的函式便可以實現

個性化的配置。(當然是按照自己的需求進行實際的複寫嘍~~~)具體的使用可以參照我Demo裡面的程式碼~

(4)converter層:略。

(5)provider層:

最核心的一層,裡面包含了endpoint、認證、以及四種授權方式的管理。如圖:


可見,此層的程式碼包數量比較多。下面拆解分析進行分析:

(1)關於approval包:裡面包含了授權的資訊,如果想要自定義展示頁面上的元素,需要研讀此包裡面的程式碼進行改寫,如圖:


(2)authentication包:這一層只講一個類,就是OAuth2AuthenticationProcessingFilter類,他主要負責當資源伺服器接收到請求,此類將進行過濾校驗等操作。


(3)client包:這裡只講一個JdbcClientDetailsService一個類,開啟此類的原始碼可以看到它裡面聲明瞭很多的sql語句。此類主要是關係著client資訊的管理。以jdbc的方式進行讀取。


(4)code、implicit、password、refresh層這裡就不再展開,就是對應著四種授權方式的管理。

(5)endpoint層:此層很重要,程式碼裡面定義了基本的介面地址,如/oauth/authorize、/oauth/token、/oauth/confirm_access等等。如下圖,這裡只說一下WhitelabelApprovalEndpoint類,此類裡面聲明瞭@RequestMapping({"/oauth/confirm_access"})這個endpoint,這個endpoint就是生成我們的授權頁面,就是那個有很多選項,讓你選擇允許還是拒絕的那個頁面,這裡此類並沒有對應的web頁面,而是在java程式碼裡建立了一個html的ModelAndView檢視,然後展示出來。所以如果你想要自定義授權頁,最簡單的方法就是把這個類copy到你的controller包裡面,然後修改成你自己想要的。


二、Demo

程式碼層面就介紹這麼多,如果有哪裡不對,歡迎一起討論。下面將給大家提供一些我寫的三個Demo,希望能給大家幫助。

Spring cloud oauth2.0的原始碼解析和本人實現的三個Demo,第一個Demo是使用Spring cloud oauth2.0來實現單點登陸;第二個Demo是使用Jdbc來做token的儲存,其中我又分別實現了一個是資源伺服器自己去校驗token,另一個是資源伺服器轉到認證伺服器去進行校驗token;第三個Demo是使用jwt的方式進行token授權和校驗。以上每種方式我都實現了認證伺服器和資源伺服器的分離,程式碼也沒有冗餘任何業務邏輯,以便讀者可以更快速的使用到自己的生產環境中,如果程式碼對大家有幫助,還望github上給個星星吶微笑

1.Demo 1:

2.Demo 2:

3.Demo 3:

三、總結

程式碼中的SQL建表語句,官方Demo裡也有,點此檢視官方提供的SQL,我的程式碼裡也有。程式碼中的資料庫換成你自己的,然後將sql檔案在資料庫裡執行一下,即可正常執行我的Demo。有問題歡迎留言交流~~~~~