面試官:說說單點登錄的實現(xiàn)原理?
單點登錄(Single Sign-On, SSO)是一種讓用戶在多個應(yīng)用系統(tǒng)之間只需登錄一次就可以訪問所有授權(quán)系統(tǒng)的機制。單點登錄主要目的是為了提高用戶體驗并簡化安全管理。
舉個例子,您在一個大型企業(yè)工作,該企業(yè)擁有一套由多個獨立應(yīng)用程序組成的生態(tài)系統(tǒng),例如:內(nèi)部郵箱系統(tǒng)、項目管理系統(tǒng)、員工自助服務(wù)系統(tǒng)、人力資源信息系統(tǒng)等。
而這些系統(tǒng)在沒有實施單點登錄的情況下會出現(xiàn)以下問題:
- 用戶體驗方面:每天開始工作時,員工需要分別登錄每一個系統(tǒng)才能正常開展工作,這不僅耗時,而且容易造成密碼疲勞,即頻繁記憶和輸入不同系統(tǒng)的登錄憑證,降低了工作效率。舉例:員工小王每天上班要先登錄內(nèi)部郵箱查看重要通知,然后切換至項目管理系統(tǒng)更新進度,接著進入人力資源信息系統(tǒng)查看工資單。如果沒有 SSO,他需要在每個系統(tǒng)單獨輸入用戶名和密碼。
- 安全管理方面:各個系統(tǒng)間的密碼策略可能不一致,員工可能會因為難以記憶而在多個系統(tǒng)使用同一密碼,增加了數(shù)據(jù)泄露的風險。同時,管理員對用戶賬戶的管理、權(quán)限變更及審計也會變得復(fù)雜。舉例:若小王在每個系統(tǒng)使用相同密碼,一旦某一系統(tǒng)存在安全隱患導(dǎo)致密碼泄露,攻擊者就有可能借此嘗試登錄其他系統(tǒng)。而有了 SSO,管理員只需在一處更改或撤銷小王的登錄權(quán)限,就能影響所有相關(guān)系統(tǒng)。
采用單點登錄后,小王只需在一天開始時登錄一次,之后訪問其他所有系統(tǒng)時都將自動識別其身份并授權(quán)訪問,無需再次驗證。這樣既減少了用戶登錄負擔,又提高了安全性,因為管理員可以通過統(tǒng)一的入口更有效地執(zhí)行身份驗證、授權(quán)以及審計策略。同時,SSO 還可以配合多因素認證(MFA)等增強措施,進一步提升整個系統(tǒng)的安全級別。
1.單點登錄實現(xiàn)原理
單點登錄是在用戶登錄一個業(yè)務(wù)系統(tǒng)時,先將登錄信息發(fā)送至單獨的 SSO 服務(wù)器進行認證,如果認證成功則向該應(yīng)用程序或系統(tǒng)發(fā)送授權(quán)令牌,之后該用戶就可以使用授權(quán)令牌完成登錄并操作所有系統(tǒng)了。
單獨登錄通常的操作流程是這樣的:
用戶認證:
- 用戶首先訪問一個系統(tǒng),輸入用戶名和密碼進行登錄。
- 登錄請求被發(fā)送到專門的認證中心(Authentication Server)。
- 認證中心驗證用戶的身份信息,如果驗證成功,則生成一個安全令牌(如 JWT、Ticket 等)。
令牌發(fā)放與傳遞:
- 認證中心將令牌返回給用戶首次登錄的應(yīng)用系統(tǒng)。
- 應(yīng)用系統(tǒng)將令牌存儲在用戶的本地會話(如瀏覽器的 Cookie)中。
- 當用戶訪問其他需要 SSO 支持的應(yīng)用系統(tǒng)時,瀏覽器會攜帶令牌自動發(fā)送給目標系統(tǒng)。
令牌驗證與授權(quán):
- 目標系統(tǒng)接收到請求后,發(fā)現(xiàn)攜帶了令牌,則將令牌發(fā)送給認證中心進行驗證。
- 認證中心驗證令牌的有效性(包括簽名、有效期等)。
- 如果令牌有效,認證中心會返回一個確認信息給目標系統(tǒng),證明用戶已通過認證。
資源共享與授權(quán):
- 目標系統(tǒng)接收到認證中心的確認后,允許用戶訪問系統(tǒng)資源,而無需再次登錄。
- 目標系統(tǒng)可以依據(jù)令牌中的信息進行權(quán)限控制和角色映射。
會話管理:
- 為了保證安全性,一般會設(shè)置令牌的有效期,過了有效期后需要重新認證。
- 在某些實現(xiàn)中,當用戶在一個子系統(tǒng)中注銷時,會通知認證中心撤銷所有關(guān)聯(lián)令牌,從而實現(xiàn)全局注銷,保證了其他系統(tǒng)也無法繼續(xù)使用過期的認證信息。
在技術(shù)實現(xiàn)上,單點登錄可以借助如 CAS(Central Authentication Service)、OAuth、OpenID Connect 等標準協(xié)議,也可以基于企業(yè)內(nèi)部的自定義協(xié)議實現(xiàn)。在整個流程中,關(guān)鍵是要維護一個全局認可的信任票證(token),并通過集中式的認證服務(wù)中心來進行身份的統(tǒng)一管理和驗證。
2.單點登錄實現(xiàn)
在 Java 項目中,實現(xiàn)單點登錄(SSO)的方案主要有以下幾種:
- OAuth2 + JWT(JSON Web Tokens)方案:OAuth2 是一個開放標準,允許用戶授權(quán)第三方應(yīng)用訪問他們在服務(wù)提供商處存儲的特定信息,而不需要將用戶名和密碼提供給第三方應(yīng)用。JWT 是一種用于身份驗證和授權(quán)的令牌,通常與 OAuth2 一起使用。在 Spring Boot 中,你可以使用 Spring Security OAuth2 和 JWT 庫來實現(xiàn)這種方案。
- CAS(Central Authentication Service)單點登錄方案:CAS 是一個開源的、用于企業(yè)級的單點登錄解決方案。它提供了一套服務(wù)端和客戶端的組件,使得在多個應(yīng)用之間實現(xiàn)單點登錄變得簡單。在 Spring Boot 中,你可以使用 Spring Security CAS 客戶端來實現(xiàn)這種方案。
- Spring Security + OAuth2:Spring Security 是一個提供身份驗證和授權(quán)功能的框架,它可以與 OAuth2 一起使用來實現(xiàn)單點登錄。在這種方案中,你可以使用 Spring Security 來處理用戶的身份驗證和授權(quán),然后使用 OAuth2 來管理用戶在多個應(yīng)用之間的訪問。
- Spring Session:Spring Session 是一個用于管理用戶會話的框架,它可以幫助你在多個應(yīng)用之間共享會話信息,從而實現(xiàn)單點登錄。你可以使用 Spring Session 來將會話信息存儲在共享的地方(如 Redis),然后在每個應(yīng)用中通過 Spring Session 來訪問這些會話信息。
其中,OAuth2 + JWT 方案適合于需要對外提供 API 接口的應(yīng)用,而 CAS 方案則更適合于內(nèi)部系統(tǒng)之間的單點登錄。Spring Security + OAuth2 方案則是一種比較通用的選擇,既可以處理內(nèi)部系統(tǒng)的單點登錄,也可以處理對外提供 API 接口的情況。Spring Session 方案則更適合于需要將會話信息共享到多個應(yīng)用之間的場景,它也是最早和最簡單的單點登錄實現(xiàn)方式。
3.SSO 和 OAuth2 有什么區(qū)別?
SSO 和 OAuth2 都是用于管理用戶身份驗證和授權(quán)的協(xié)議,但它們的目標和應(yīng)用場景有所不同,具體區(qū)別如下:
目標:
- SSO 的主要目標是簡化用戶在多個應(yīng)用系統(tǒng)中的登錄流程,讓用戶只需要登錄一次就可以訪問所有授權(quán)的應(yīng)用系統(tǒng),提高用戶體驗和效率。
- OAuth2 的主要目標是允許第三方應(yīng)用代表用戶獲得訪問特定資源的權(quán)限,同時保護用戶的敏感信息(如密碼)不被泄露。
應(yīng)用場景:
- SSO 通常用于大型企業(yè)內(nèi)部或相關(guān)聯(lián)的系統(tǒng)之間,用戶只需要在一個地方(如企業(yè)門戶)進行登錄,就可以訪問多個內(nèi)部系統(tǒng)。
- OAuth2 廣泛應(yīng)用于第三方應(yīng)用需要訪問用戶存儲在服務(wù)提供商(如 Google、Facebook)中的資源時,用戶授權(quán)第三方應(yīng)用訪問其資源,而無需將用戶名和密碼直接提供給第三方應(yīng)用。
實現(xiàn)方式:
- SSO 的實現(xiàn)通常依賴于一個集中的認證中心(Authentication Server),用戶在這個中心進行登錄,并獲得一個全局會話或令牌(Token),然后在訪問其他應(yīng)用系統(tǒng)時,這個令牌會被用來驗證用戶的身份和權(quán)限。
- OAuth2 的實現(xiàn)涉及四個角色:資源所有者(Resource Owner)、授權(quán)服務(wù)器(Authorization Server)、客戶端(Client)和資源服務(wù)器(Resource Server)。用戶(資源所有者)授權(quán)客戶端訪問其資源,授權(quán)服務(wù)器頒發(fā)訪問令牌給客戶端,客戶端使用這個令牌訪問資源服務(wù)器上的資源。
“
PS:SSO 和 OAuth2 都是用于管理用戶身份驗證和授權(quán)的協(xié)議,但 SSO 更注重于簡化用戶在多個應(yīng)用系統(tǒng)中的登錄流程,而 OAuth2更 注重于保護用戶的敏感信息,并允許第三方應(yīng)用代表用戶訪問特定資源。在實際應(yīng)用中,它們可以相互結(jié)合使用,例如使用 OAuth2 來實現(xiàn) SSO 中的令牌頒發(fā)和驗證過程。