當前位置:編程學習大全網 - 源碼破解 - OAuth2實現單點登錄SSO

OAuth2實現單點登錄SSO

1. 前言

技術這東西吧,看別人寫的好像很簡單似的,到自己去寫的時候就各種問題,“壹看就會,壹做就錯”。網上關於實現SSO的文章壹大堆,但是當妳真的照著寫的時候就會發現根本不是那麽回事兒,簡直讓人抓狂,尤其是對於我這樣的菜鳥。幾經曲折,終於搞定了,決定記錄下來,以便後續查看。先來看壹下效果

2. 準備

2.1. 單點登錄

最常見的例子是,我們打開淘寶APP,首頁就會有天貓、聚劃算等服務的鏈接,當妳點擊以後就直接跳過去了,並沒有讓妳再登錄壹次

下面這個圖是我再網上找的,我覺得畫得比較明白:

可惜有點兒不清晰,於是我又畫了個簡版的:

重要的是理解:

2.2. OAuth2

推薦以下幾篇博客

《 OAuth 2.0 》

《 Spring Security對OAuth2的支持 》

3. 利用OAuth2實現單點登錄

接下來,只講跟本例相關的壹些配置,不講原理,不講為什麽

眾所周知,在OAuth2在有授權服務器、資源服務器、客戶端這樣幾個角色,當我們用它來實現SSO的時候是不需要資源服務器這個角色的,有授權服務器和客戶端就夠了。

授權服務器當然是用來做認證的,客戶端就是各個應用系統,我們只需要登錄成功後拿到用戶信息以及用戶所擁有的權限即可

之前我壹直認為把那些需要權限控制的資源放到資源服務器裏保護起來就可以實現權限控制,其實是我想錯了,權限控制還得通過Spring Security或者自定義攔截器來做

3.1. Spring Security 、OAuth2、JWT、SSO

在本例中,壹定要分清楚這幾個的作用

首先,SSO是壹種思想,或者說是壹種解決方案,是抽象的,我們要做的就是按照它的這種思想去實現它

其次,OAuth2是用來允許用戶授權第三方應用訪問他在另壹個服務器上的資源的壹種協議,它不是用來做單點登錄的,但我們可以利用它來實現單點登錄。在本例實現SSO的過程中,受保護的資源就是用戶的信息(包括,用戶的基本信息,以及用戶所具有的權限),而我們想要訪問這這壹資源就需要用戶登錄並授權,OAuth2服務端負責令牌的發放等操作,這令牌的生成我們采用JWT,也就是說JWT是用來承載用戶的Access_Token的

最後,Spring Security是用於安全訪問的,這裏我們我們用來做訪問權限控制

4. 認證服務器配置

4.1. Maven依賴

這裏面最重要的依賴是:spring-security-oauth2-autoconfigure

4.2. application.yml

4.3. AuthorizationServerConfig(重要)

說明:

4.4. WebSecurityConfig(重要)

4.5. 自定義登錄頁面(壹般來講都是要自定義的)

自定義登錄頁面的時候,只需要準備壹個登錄頁面,然後寫個Controller令其可以訪問到即可,登錄頁面表單提交的時候method壹定要是post,最重要的時候action要跟訪問登錄頁面的url壹樣

千萬記住了,訪問登錄頁面的時候是GET請求,表單提交的時候是POST請求,其它的就不用管了

4.6. 定義客戶端

4.7. 加載用戶

登錄賬戶

加載登錄賬戶

4.8. 驗證

當我們看到這個界面的時候,表示認證服務器配置完成  

5. 兩個客戶端

5.1. Maven依賴

5.2. application.yml

這裏context-path不要設成/,不然重定向獲取code的時候回被攔截

5.3. WebSecurityConfig

說明:

5.4. MemberController

5.5. Order項目跟它是壹樣的

5.6. 關於退出

退出就是清空用於與SSO客戶端建立的所有的會話,簡單的來說就是使所有端點的Session失效,如果想做得更好的話可以令Token失效,但是由於我們用的JWT,故而撤銷Token就不是那麽容易,關於這壹點,在官網上也有提到:

本例中采用的方式是在退出的時候先退出業務服務器,成功以後再回調認證服務器,但是這樣有壹個問題,就是需要主動依次調用各個業務服務器的logout

6. 工程結構

附上源碼: blogs.com/cjsblog/p/9174797.html

blogs.com/cjsblog/p/9184173.html

blogs.com/cjsblog/p/9230990.html

blogs.com/cjsblog/p/9277677.html

blogs.com/lihaoyang/p/8581077.html

blogs.com/charlypage/p/9383420.html

/t/630.html

9. 文檔

blogs.com/cjsblog/p/10548022.html

  • 上一篇:trukfit是什麽牌子
  • 下一篇:世界上最大金礦石,重45噸價值120億,後來怎樣了?
  • copyright 2024編程學習大全網