SpringBootSecurity學習(14)前後端分離版之 OAuth2.0介紹
- 2019 年 10 月 6 日
- 筆記
登錄總結
前面基本介紹了security的常規用法,同時介紹了JWT和它的一個簡單實現,基本上開發中遇到的登錄問題都能解決了,即使在分散式開發,或者微服務開發中實現登錄也基本沒有問題了。security本身已經實現的比較完善的安全處理,加上JWT的驗證方式,可以實現一個理想的登錄功能。
我們來看登錄,給用戶一個帳號,驗證有效後登錄成功,這一步是任何系統都無法避免的。無論這個帳號只能登錄一個系統還是像支付寶帳號一樣登錄多個app,無論帳號是用戶名密碼,還是手機驗證碼,或者郵箱等其他形式,可以說認證這一步是最基礎的,無法避免。
登錄成功後,通過授權可以讓用戶訪問一些登錄前無法訪問的頁面或者介面,而且無論session或者token,其實都是有有效期的,過了有效期就需要重新登錄。從這種形式上看,授權包含了更多的場景,不僅是內部已經登錄的用戶,還有可能是第三方的應用,或者兩個系統之間的資訊交換等等。而且微服務的開發模式下,服務越來越多,可以被授權的內容也越來越多,如果沒有統一的方式來管理這些介面資源的授權,會非常麻煩。因此,系統針對所有的訪問需要有統一的認證和授權的機制,而 OAuth2.0 是我們實現這種統一認證授權非常好的一個選擇。
OAuth2.0介紹
OAuth 2.0 是目前最流行的授權機制,用來授權第三方應用,獲取用戶數據。最經典的場景就是我們使用QQ來進行第三方登錄的時候,選擇可以訪問用戶的哪些資訊。關於OAuth 2.0的介紹,推薦讀取阮一峰的三篇介紹文章,地址是:
這三篇文章是一個非常好和非常詳細的OAuth2.0的入門。
關於OAuth2.0的理解,用來授權第三方應用,以前總是理解不到位的原因是,我沒有站在不同的角度去分析思考。比如在使用QQ進行第三方登錄時,是我們登錄的軟體需要獲取我們qq帳號的部分用戶資訊,因此需要騰訊的認證授權,我們需要在一鍵登錄(授權)的時候,登錄QQ,點擊同意即可。
而如果我們作為開發人員,去設計一個OAuth2.0授權功能的時候,需要從開發人員角度去思考哪部分是我們要完成的功能,比如上面的QQ第三方登錄,首先QQ軟體是我們開發人員開發的,第三方應用有一個我們軟體的QQ帳號,第三方用戶想在自己的軟體上面展示第三方的QQ帳號的部分用戶資訊,需要來我們的授權服務申請,同意後才能查詢我們開發的軟體中的用戶資訊,因此我們要開發的是一個基本的QQ服務(資源服務),一個授權服務,並且第三方可以在我方註冊帳號,或者可以給第三方分配帳號。
關於第三方應用,可以是其它公司的系統,也可以本公司架構內的其它服務,大家可以根據阮一峰的文章,參考開發人員的任務屬於文章中的哪些內容。這樣,對開發OAuth2.0和使用OAuth2.0會有清晰的區分和理解。
SSO單點登錄
單點登錄(SingleSignOn,SSO),就是通過用戶的一次性鑒別登錄。當用戶在身份認證伺服器上登錄一次以後,即可獲得訪問單點登錄系統中其他關聯繫統和應用軟體的許可權,同時這種實現是不需要管理員對用戶的登錄狀態或其他資訊進行修改的,這意味著在多個應用系統中,用戶只需一次登錄就可以訪問所有相互信任的應用系統。這種方式減少了由登錄產生的時間消耗,輔助了用戶管理,是目前比較流行的。
當用戶第一次訪問應用系統A的時候,因為還沒有登錄,會被引導到認證系統中進行登錄;根據用戶提供的登錄資訊,認證系統進行身份校驗,如果通過校驗,應該返回給用戶一個認證的憑據--ticket;用戶再訪問別的應用的時候就會將這個ticket帶上,作為自己認證的憑據,應用系統接受到請求之後會把ticket送到認證系統進行校驗,檢查ticket的合法性。如果通過校驗,用戶就可以在不用再次登錄的情況下訪問應用系統B和應用系統C了。
從上面的介紹可以看得出,單點登錄需要的正是一個共享的授權和驗證系統,也就是說SSO是可以使用OAuth2.0機制去設計實現的。但是SSO和OAuth2.0也有一點區別,sso和oauth2.0在應用場景上的區別在於,使用sso的各個系統(子模組)之間是互相信任的,通常是一個廠家的各個軟體產品,或者是一個產品的不同模組系統。使用oauth2.0的各個應用大部分之間是互相不信任的,通常是不同廠家之間的帳號共享。OAuth2.0 解決的是服務提供方(微信等)給第三方應用授權的問題,而SSO解決的是大型系統中各個子系統如何共享登陸狀態的問題(比如你登錄了百度首頁,那麼你進入百度百科,百度貼吧,百度音樂等服務的時候都不需要重新登錄)。
Spring Cloud Security
Spring Cloud Security組件可以理解為,springboot security加上OAuth2.0的整合,可以實現微服務系統中sso單點登錄功能,和第三方授權功能,是一個強大的許可權組件。關於springboot2.1.x版本對應使用的springcloud的security組件的官方文檔如下:
文檔的目錄如下:
從目錄上看,Spring Cloud Security組件主要的功能也是sso和資源認證授權,後面的內容主要用來學習Spring Cloud Security。