名詞
- OAuth 2:除非有“標準”、“協議”等特別説明,例如:OAuth 2 標準或 OAuth 2 協議,否則本文中的 OAuth 2 均指代的是
Spring Security OAuth2、Spring Authorization Server等 OAuth 2 協議的具體實現組件或框架。 - Spring Security 生態:在本文中為了表述方便,“Spring Security 生態”指代的是
Spring Security、Spring Security OAuth2、Spring Authorization Server、Spring Security OAuth2 Client等一系列 Spring 生態安全相關組件或框架。
概述
OAuth 全稱是 Open Authentication。大家都知道 OAuth 是一個開放標準,但是除此以外似乎找不到一個非常準確的而且容易理解的 OAuth 定義。在網絡中能夠搜索到的 OAuth 的定義,基本都是來源於網絡各文章作者自己對 OAuth 的理解。
為此,特別選擇了一個筆者本人認為相對來説更容易理解的一個定義,具體如下:
開放授權( OAuth )是一個開放標準,允許用户讓第三方應用訪問該用户在某一網站上存儲的私密的資源(如照片,視頻,聯繫人列表),而無需將用户名和密碼提供給第三方應用。 OAuth 允許用户提供一個令牌,而不是用户名和密碼來訪問他們存放在特定服務提供者的數據。每一個令牌授權一個特定的網站(例如,視頻編輯網站)在特定的時段(例如,接下來的2小時內)內訪問特定的資源(例如僅僅是某一相冊中的視頻)。這樣,OAuth讓用户可以授權第三方網站訪問他們存儲在另外服務提供者的某些特定信息,而非所有內容。
OAuth 主要有 OAuth 1.0 和 OAuth 2.0 兩個版本,並且二者完全不同,且不兼容。OAuth 2.0 是目前廣泛使用的版本,我們多數談論 OAuth 時,一般都是指的 OAuth 2.0 版本。隨着Spring Authorization Server 逐步普及, OAuth 2.1 版本也逐步地進入了大眾的視野。
這裏為什麼要提及 OAuth 的定義?請注意定義中的關鍵詞“第三方應用”,這個詞對於理解後續內容有着至關重要的作用。
筆者認為使用 OAuth 2 最大的難點,是對 OAuth 2 中各種術語以及概念的理解——這裏所説的“理解”,指的不僅僅是對概念字面意思的理解,而是對其真正“含義”的理解。能否真正理解這些術語以及概念的“含義”,會直接影響使用 OAuth 2 的系統設計及實現,甚至影響整個系統的安全保障能力。
OAuth 2 中最為特殊的概念就是 Scope。單獨來看 Scope其實並不難理解,但因為 Spring Security生態組件中不僅有 Scope 概念還提供了Role概念。在此基礎之上,如果再加上 RBAC 權限模型,那麼就會讓 OAuth 2 的相關概念變得難以理解。
OAuth 2 中 Scope 和 Role 關係和區別到底是什麼?在實際設計過程中,如何應用和處理 Scope 與 Role關係?就成為使用 OAuth2 的關鍵技術難點之一。
本篇文章,旨在根據筆者個人經驗和理解,結合 Dante Cloud 實際應用,深入解析 OAuth 2 中 Scope 和 Role 的概念及應用方法。
OAuth 2 與 Spring Security 關係
OAuth 2 是一種協議,所以實現的方式、組件、產品多種多樣。文中的 OAuth 2,指代的是Spring Security OAuth2或Spring Authorization Security等 Spring 生態中的 OAuth 2 實現。後續部分內容中,也會沿用這種表述方式僅是為了方便,請各位讀者注意語境的切換。
OAuth 是一個授權協議,OAuth 框架能讓“第三方應用”以優先的權限訪問 HTTP 服務。作為一個授權框架,OAuth 關注是如何讓一個系統組件獲取對另一個系統組件的訪問權限。
OAuth 不是身份認證協議,雖然可以使用它構建具有身份認證功能系統,並且 OAuth 自身在多個地方也使用了身份認證(最典型的就是資源擁有者和客户端軟件軟件要想授權服務器進行身份認證),但這種內嵌身份認證的行為並不會將 OAuth 自身轉變成身份認證協議。
正因為 OAuth 不是身份認證協議,所以身份認證和鑑權功能要基於其它組件來實現。使用 Spring Security OAuth2 或 Spring Authorization Server實現 OAuth 2 授權服務器,首選的身份認證和鑑權組件就是 Spring Security。
這一點對於理解基於 Spring Security生態組件以及微服務架構的設計、實現也非常重要。
小結一下:
- OAuth 2 是一個授權協議,不具備認證、鑑權能力。注意:這裏的授權與 RBAC 中為用户角色分配權限的那種“授權”不同。
Spring Security OAuth2或Spring Authorization Server實現的基於 OAuth 2 協議的授權服務器只負責“授權”,用户的身份認證和鑑權等均由Spring Security負責實現。
那麼,Spring Security OAuth2 或 Spring Authorization Server是如何與 Spring Security關聯起來的?最終形成一套既包含授權功能,又包含認證和鑑權功能的完整的系統的呢?暫且,我們先拋開代碼層面整合的“物理”實現關係,只從整合實現的“邏輯”實現關係思考,關鍵的因素就是:包含權限信息的 ”用户身份“(詳情會在更多內容中詳細解析)