面試官:說說SSO單點登錄的實現原理?

單點登錄(Single Sign-On, SSO)是一種讓用戶在多個應用系統之間只需登錄一次就可以訪問所有授權系統的機制。單點登錄主要目的是爲了提高用戶體驗並簡化安全管理。

舉個例子,您在一個大型企業工作,該企業擁有一套由多個獨立應用程序組成的生態系統,例如:內部郵箱系統、項目管理系統、員工自助服務系統、人力資源信息系統等。

而這些系統在沒有實施單點登錄的情況下會出現以下問題:

  1. 用戶體驗方面: 每天開始工作時,員工需要分別登錄每一個系統才能正常開展工作,這不僅耗時,而且容易造成密碼疲勞,即頻繁記憶和輸入不同系統的登錄憑證,降低了工作效率。舉例:員工小王每天上班要先登錄內部郵箱查看重要通知,然後切換至項目管理系統更新進度,接着進入人力資源信息系統查看工資單。如果沒有 SSO,他需要在每個系統單獨輸入用戶名和密碼。
  2. 安全管理方面: 各個系統間的密碼策略可能不一致,員工可能會因爲難以記憶而在多個系統使用同一密碼,增加了數據泄露的風險。同時,管理員對用戶賬戶的管理、權限變更及審計也會變得複雜。舉例:若小王在每個系統使用相同密碼,一旦某一系統存在安全隱患導致密碼泄露,攻擊者就有可能借此嘗試登錄其他系統。而有了 SSO,管理員只需在一處更改或撤銷小王的登錄權限,就能影響所有相關係統。

採用單點登錄後,小王只需在一天開始時登錄一次,之後訪問其他所有系統時都將自動識別其身份並授權訪問,無需再次驗證。這樣既減少了用戶登錄負擔,又提高了安全性,因爲管理員可以通過統一的入口更有效地執行身份驗證、授權以及審計策略。同時,SSO 還可以配合多因素認證(MFA)等增強措施,進一步提升整個系統的安全級別。

1.單點登錄實現原理

單點登錄是在用戶登錄一個業務系統時,先將登錄信息發送至單獨的 SSO 服務器進行認證,如果認證成功則向該應用程序或系統發送授權令牌,之後該用戶就可以使用授權令牌完成登錄並操作所有系統了。

單獨登錄通常的操作流程是這樣的:

  1. 用戶認證:
    • 用戶首先訪問一個系統,輸入用戶名和密碼進行登錄。
    • 登錄請求被髮送到專門的認證中心(Authentication Server)。
    • 認證中心驗證用戶的身份信息,如果驗證成功,則生成一個安全令牌(如 JWT、Ticket 等)。
  2. 令牌發放與傳遞:
    • 認證中心將令牌返回給用戶首次登錄的應用系統。
    • 應用系統將令牌存儲在用戶的本地會話(如瀏覽器的 Cookie)中。
    • 當用戶訪問其他需要 SSO 支持的應用系統時,瀏覽器會攜帶令牌自動發送給目標系統。
  3. 令牌驗證與授權:
    • 目標系統接收到請求後,發現攜帶了令牌,則將令牌發送給認證中心進行驗證。
    • 認證中心驗證令牌的有效性(包括簽名、有效期等)。
    • 如果令牌有效,認證中心會返回一個確認信息給目標系統,證明用戶已通過認證。
  4. 資源共享與授權:
    • 目標系統接收到認證中心的確認後,允許用戶訪問系統資源,而無需再次登錄。
    • 目標系統可以依據令牌中的信息進行權限控制和角色映射。
  5. 會話管理:
    • 爲了保證安全性,一般會設置令牌的有效期,過了有效期後需要重新認證。
    • 在某些實現中,當用戶在一個子系統中註銷時,會通知認證中心撤銷所有關聯令牌,從而實現全局註銷,保證了其他系統也無法繼續使用過期的認證信息。

在技術實現上,單點登錄可以藉助如 CAS(Central Authentication Service)、OAuth、OpenID Connect 等標準協議,也可以基於企業內部的自定義協議實現。在整個流程中,關鍵是要維護一個全局認可的信任票證(token),並通過集中式的認證服務中心來進行身份的統一管理和驗證。

2.單點登錄實現

在 Java 項目中,實現單點登錄(SSO)的方案主要有以下幾種:

  1. OAuth2 + JWT(JSON Web Tokens)方案:OAuth2 是一個開放標準,允許用戶授權第三方應用訪問他們在服務提供商處存儲的特定信息,而不需要將用戶名和密碼提供給第三方應用。JWT 是一種用於身份驗證和授權的令牌,通常與 OAuth2 一起使用。在 Spring Boot 中,你可以使用 Spring Security OAuth2 和 JWT 庫來實現這種方案。
  2. CAS(Central Authentication Service)單點登錄方案:CAS 是一個開源的、用於企業級的單點登錄解決方案。它提供了一套服務端和客戶端的組件,使得在多個應用之間實現單點登錄變得簡單。在 Spring Boot 中,你可以使用 Spring Security CAS 客戶端來實現這種方案。
  3. Spring Security + OAuth2:Spring Security 是一個提供身份驗證和授權功能的框架,它可以與 OAuth2 一起使用來實現單點登錄。在這種方案中,你可以使用 Spring Security 來處理用戶的身份驗證和授權,然後使用 OAuth2 來管理用戶在多個應用之間的訪問。
  4. Spring Session:Spring Session 是一個用於管理用戶會話的框架,它可以幫助你在多個應用之間共享會話信息,從而實現單點登錄。你可以使用 Spring Session 來將會話信息存儲在共享的地方(如 Redis),然後在每個應用中通過 Spring Session 來訪問這些會話信息。

其中,OAuth2 + JWT 方案適合於需要對外提供 API 接口的應用,而 CAS 方案則更適合於內部系統之間的單點登錄。Spring Security + OAuth2 方案則是一種比較通用的選擇,既可以處理內部系統的單點登錄,也可以處理對外提供 API 接口的情況。Spring Session 方案則更適合於需要將會話信息共享到多個應用之間的場景,它也是最早和最簡單的單點登錄實現方式。

3.SSO 和 OAuth2 有什麼區別?

SSO 和 OAuth2 都是用於管理用戶身份驗證和授權的協議,但它們的目標和應用場景有所不同,具體區別如下:

  1. 目標:
  • SSO 的主要目標是簡化用戶在多個應用系統中的登錄流程,讓用戶只需要登錄一次就可以訪問所有授權的應用系統,提高用戶體驗和效率。
  • OAuth2 的主要目標是允許第三方應用代表用戶獲得訪問特定資源的權限,同時保護用戶的敏感信息(如密碼)不被泄露。
  1. 應用場景:
  • SSO 通常用於大型企業內部或相關聯的系統之間,用戶只需要在一個地方(如企業門戶)進行登錄,就可以訪問多個內部系統。
  • OAuth2 廣泛應用於第三方應用需要訪問用戶存儲在服務提供商(如 Google、Facebook)中的資源時,用戶授權第三方應用訪問其資源,而無需將用戶名和密碼直接提供給第三方應用。
  1. 實現方式:
  • SSO 的實現通常依賴於一個集中的認證中心(Authentication Server),用戶在這個中心進行登錄,並獲得一個全局會話或令牌(Token),然後在訪問其他應用系統時,這個令牌會被用來驗證用戶的身份和權限。
  • OAuth2 的實現涉及四個角色:資源所有者(Resource Owner)、授權服務器(Authorization Server)、客戶端(Client)和資源服務器(Resource Server)。用戶(資源所有者)授權客戶端訪問其資源,授權服務器頒發訪問令牌給客戶端,客戶端使用這個令牌訪問資源服務器上的資源。

PS:SSO 和 OAuth2 都是用於管理用戶身份驗證和授權的協議,但 SSO 更注重於簡化用戶在多個應用系統中的登錄流程,而 OAuth2更 注重於保護用戶的敏感信息,並允許第三方應用代表用戶訪問特定資源。在實際應用中,它們可以相互結合使用,例如使用 OAuth2 來實現 SSO 中的令牌頒發和驗證過程。

課後思考

說說 OAuth2 的實現原理?它有幾種授權模式?OAuth2 常用框架有哪些?它們有什麼區別?

本文已收錄到我的面試小站 www.javacn.site,其中包含的內容有:Redis、JVM、併發、併發、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、設計模式、消息隊列等模塊。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章