1. 程式人生 > >SpringBootSecurity學習(14)前後端分離版之 OAuth2.0介紹

SpringBootSecurity學習(14)前後端分離版之 OAuth2.0介紹

登入總結

前面基本介紹了security的常規用法,同時介紹了JWT和它的一個簡單實現,基本上開發中遇到的登入問題都能解決了,即使在分散式開發,或者微服務開發中實現登入也基本沒有問題了。security本身已經實現的比較完善的安全處理,加上JWT的驗證方式,可以實現一個理想的登入功能。

我們來看登入,給使用者一個賬號,驗證有效後登入成功,這一步是任何系統都無法避免的。無論這個賬號只能登入一個系統還是像支付寶賬號一樣登入多個app,無論賬號是使用者名稱密碼,還是手機驗證碼,或者郵箱等其他形式,可以說認證這一步是最基礎的,無法避免。

登入成功後,通過授權可以讓使用者訪問一些登入前無法訪問的頁面或者介面,而且無論session或者token,其實都是有有效期的,過了有效期就需要重新登入。從這種形式上看,授權包含了更多的場景,不僅是內部已經登入的使用者,還有可能是第三方的應用,或者兩個系統之間的資訊交換等等。而且微服務的開發模式下,服務越來越多,可以被授權的內容也越來越多,如果沒有統一的方式來管理這些介面資源的授權,會非常麻煩。因此,系統針對所有的訪問需要有統一的認證和授權的機制,而 OAuth2.0 是我們實現這種統一認證授權非常好的一個選擇。

OAuth2.0介紹

OAuth 2.0 是目前最流行的授權機制,用來授權第三方應用,獲取使用者資料。最經典的場景就是我們使用QQ來進行第三方登入的時候,選擇可以訪問使用者的哪些資訊。關於OAuth 2.0的介紹,推薦讀取阮一峰的三篇介紹文章,地址是:

  • OAuth 2.0 的一個簡單解釋

  • OAuth 2.0 的四種方式

  • GitHub OAuth 第三方登入示例教程

這三篇文章是一個非常好和非常詳細的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元件的官方文件如下:

  • https://cloud.spring.io/spring-cloud-static/spring-cloud-security/2.1.4.RELEASE/single/spring-cloud-security.html

文件的目錄如下:

從目錄上看,Spring Cloud Security元件主要的功能也是sso和資源認證授權,後面的內容主要用來學習Spring Cloud Security