在企業發展初期,企業使用的系統不多,一般一個或者兩個,每一個系統都有本身的登陸模塊,運營人員天天用本身的帳號登陸,很方便。
但隨着企業的發展,用到的系統隨之增多,運營人員在操做不一樣的系統時,須要屢次登陸,並且每一個系統的帳號都不同,這對於運營人員
來講,很不方便。因而,就想到是否是能夠在一個系統登陸,其餘系統就不用登陸了呢?這就是單點登陸要解決的問題。跨域
單點登陸英文全稱Single Sign On,簡稱就是SSO。它的解釋是:在多個應用系統中,只須要登陸一次,就能夠訪問其餘相互信任的應用系統。瀏覽器
如圖所示,圖中有4個系統,分別是Application一、Application二、Application三、和SSO。Application一、Application二、Application3沒有登陸模塊,而SSO只有登陸模塊,沒有其餘的業務模塊,當Application一、Application二、Application3須要登陸時,將跳到SSO系統,SSO系統完成登陸,其餘的應用系統也就隨之登陸了。這徹底符合咱們對單點登陸(SSO)的定義。安全
在說單點登陸(SSO)的技術實現以前,咱們先說一說普通的登陸認證機制。服務器
如上圖所示,咱們在瀏覽器(Browser)中訪問一個應用,這個應用須要登陸,咱們填寫完用戶名和密碼後,完成登陸認證。這時,咱們在這個用戶的session中標記登陸狀態爲yes(已登陸),同時在瀏覽器(Browser)中寫入Cookie,這個Cookie是這個用戶的惟一標識。下次咱們再訪問這個應用的時候,請求中會帶上這個Cookie,服務端會根據這個Cookie找到對應的session,經過session來判斷這個用戶是否登陸。若是不作特殊配置,這個Cookie的名字叫作jsessionid,值在服務端(server)是惟一的。session
一個企業通常狀況下只有一個域名,經過二級域名區分不一樣的系統。好比咱們有個域名叫作:a.com,同時有兩個業務系統分別爲:app1.a.com和app2.a.com。咱們要作單點登陸(SSO),須要一個登陸系統,叫作:sso.a.com。app
咱們只要在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登陸呢?這裏有兩個問題:dom
那麼咱們如何解決這兩個問題呢?針對第一個問題,sso登陸之後,能夠將Cookie的域設置爲頂域,即.a.com,這樣全部子域的系統均可以訪問到頂域的Cookie。咱們在設置Cookie時,只能設置頂域和本身的域,不能設置其餘的域。好比:咱們不能在本身的系統中給baidu.com的域設置Cookie。3d
Cookie的問題解決了,咱們再來看看session的問題。咱們在sso系統登陸了,這時再訪問app1,Cookie也帶到了app1的服務端(Server),app1的服務端怎麼找到這個Cookie對應的Session呢?這裏就要把3個系統的Session共享,如圖所示。共享Session的解決方案有不少,例如:Spring-Session。這樣第2個問題也解決了。server
同域下的單點登陸就實現了,但這還不是真正的單點登陸。blog
同域下的單點登陸是巧用了Cookie頂域的特性。若是是不一樣域呢?不一樣域之間Cookie是不共享的,怎麼辦?
這裏咱們就要說一說CAS流程了,這個流程是單點登陸的標準流程。
上圖是CAS官網上的標準流程,具體流程以下:
至此,跨域單點登陸就完成了。之後咱們再訪問app系統時,app就是登陸的。接下來,咱們再看看訪問app2系統時的流程。
這樣,app2系統不須要走登陸流程,就已是登陸了。SSO,app和app2在不一樣的域,它們之間的session不共享也是沒問題的。
有的同窗問我,SSO系統登陸後,跳回原業務系統時,帶了個參數ST,業務系統還要拿ST再次訪問SSO進行驗證,以爲這個步驟有點多餘。他想SSO登陸認證經過後,經過回調地址將用戶信息返回給原業務系統,原業務系統直接設置登陸狀態,這樣流程簡單,也完成了登陸,不是很好嗎?
其實這樣問題時很嚴重的,若是我在SSO沒有登陸,而是直接在瀏覽器中敲入回調的地址,並帶上僞造的用戶信息,是否是業務系統也認爲登陸了呢?這是很可怕的。
單點登陸(SSO)的全部流程都介紹完了,原理你們都清楚了。總結一下單點登陸要作的事情: