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上給個星星吶