當前位置:名人名言大全網 - 短信平臺 - 話說單點登錄

話說單點登錄

在企業發展初期,企業使用的系統很少,通常壹個或者兩個,每個系統都有自己的登錄模塊,運營人員每天用自己的賬號登錄,很方便。 但隨著企業的發展,用到的系統隨之增多,運營人員在操作不同的系統時,需要多次登錄,而且每個系統的賬號都不壹樣,這對於運營人員 來說,很不方便。於是,就想到是不是可以在壹個系統登錄,其他系統就不用登錄了呢?這就是單點登錄要解決的問題。

單點登錄英文全稱Single Sign On,簡稱就是SSO。它的解釋是:在多個應用系統中,只需要登錄壹次,就可以訪問其他相互信任的應用系統。

如圖所示,圖中有4個系統,分別是Application1、Application2、Application3、和SSO。Application1、Application2、Application3沒有登錄模塊,而SSO只有登錄模塊,沒有其他的業務模塊,當Application1、Application2、Application3需要登錄時,將跳到SSO系統,SSO系統完成登錄,其他的應用系統也就隨之登錄了。這完全符合我們對單點登錄(SSO)的定義。

在說單點登錄(SSO)的技術實現之前,我們先說壹說普通的登錄認證機制。

如上圖所示,我們在瀏覽器(Browser)中訪問壹個應用,這個應用需要登錄,我們填寫完用戶名和密碼後,完成登錄認證。這時,我們在這個用戶的session中標記登錄狀態為yes(已登錄),同時在瀏覽器(Browser)中寫入Cookie,這個Cookie是這個用戶的唯壹標識。下次我們再訪問這個應用的時候,請求中會帶上這個Cookie,服務端會根據這個Cookie找到對應的session,通過session來判斷這個用戶是否登錄。如果不做特殊配置,這個Cookie的名字叫做jsessionid,值在服務端(server)是唯壹的。

壹個企業壹般情況下只有壹個域名,通過二級域名區分不同的系統。比如我們有個域名叫做:a.com,同時有兩個業務系統分別為:app1.a.com和app2.a.com。我們要做單點登錄(SSO),需要壹個登錄系統,叫做:sso.a.com。

我們只要在sso.a.com登錄,app1.a.com和app2.a.com就也登錄了。通過上面的登陸認證機制,我們可以知道,在sso.a.com中登錄了,其實是在sso.a.com的服務端的session中記錄了登錄狀態,同時在瀏覽器端(Browser)的sso.a.com下寫入了Cookie。那麽我們怎麽才能讓app1.a.com和app2.a.com登錄呢?這裏有兩個問題:

那麽我們如何解決這兩個問題呢?針對第壹個問題,sso登錄以後,可以將Cookie的域設置為頂域,即.a.com,這樣所有子域的系統都可以訪問到頂域的Cookie。我們在設置Cookie時,只能設置頂域和自己的域,不能設置其他的域。比如:我們不能在自己的系統中給baidu.com的域設置Cookie。

Cookie的問題解決了,我們再來看看session的問題。我們在sso系統登錄了,這時再訪問app1,Cookie也帶到了app1的服務端(Server),app1的服務端怎麽找到這個Cookie對應的Session呢?這裏就要把3個系統的Session***享,如圖所示。***享Session的解決方案有很多,例如:Spring-Session。這樣第2個問題也解決了。

同域下的單點登錄就實現了,但這還不是真正的單點登錄。

同域下的單點登錄是巧用了Cookie頂域的特性。如果是不同域呢?不同域之間Cookie是不***享的,怎麽辦?

這裏我們就要說壹說CAS流程了,這個流程是單點登錄的標準流程。

上圖是CAS官網上的標準流程,具體流程如下:

至此,跨域單點登錄就完成了。以後我們再訪問app系統時,app就是登錄的。接下來,我們再看看訪問app2系統時的流程。

這樣,app2系統不需要走登錄流程,就已經是登錄了。SSO,app和app2在不同的域,它們之間的session不***享也是沒問題的。

有的同學問我,SSO系統登錄後,跳回原業務系統時,帶了個參數ST,業務系統還要拿ST再次訪問SSO進行驗證,覺得這個步驟有點多余。他想SSO登錄認證通過後,通過回調地址將用戶信息返回給原業務系統,原業務系統直接設置登錄狀態,這樣流程簡單,也完成了登錄,不是很好嗎?

其實這樣問題時很嚴重的,如果我在SSO沒有登錄,而是直接在瀏覽器中敲入回調的地址,並帶上偽造的用戶信息,是不是業務系統也認為登錄了呢?這是很可怕的。

單點登錄(SSO)的所有流程都介紹完了,原理大家都清楚了。總結壹下單點登錄要做的事情:

參考自己寫的關於JWT/TOKEN文章