sso英文全稱single sign on,單點登入。sso是在多個應用系統中,使用者只需要登入一次就可以訪問所有相互信任的應用系統。cas是一種基於http協議的b/s應用系統單點登入實現方案,認識cas之前首先要熟悉http協議、session與cookie等web開發基本知識。
http是乙個客戶端和伺服器端請求和應答的標準,我們全後端開發對接的rest介面就是基於http協議。http協議包含http請求訊息(httprequest)和http應答訊息(httpresponse)兩部分。參考內容:
http協議本身是無狀態的,但有時候我們需要http請求保持狀態,我們引入session與cookie。
session用在服務端,用於儲存當前所有客戶端需要保持的狀態值,並為每乙個客戶端生成乙個唯一編碼,然後通過http響應頭set-cookie將這個編碼傳送給客戶端。
cookie用在客戶端,用於記錄後端發來過的唯一編碼,該編碼與服務端上的對應的狀態值對應,在下一次請求的時候通過http請求頭cookie帶上這個編碼,服務端就能根據這個編碼獲取該客戶端之前記錄的所有狀態值。
登入成功後,在session中寫入登入使用者的資訊,退出時清空session中的使用者資訊。可以通過filter實現。
cas首次登入會經過兩次前端跳轉、一次後端驗證。在應用系統端需要整合casclient的jar包,把其中的filter配置到站點web.xml中,用於攔截請求、判斷登入、發起跳轉或發起驗證等。在sso伺服器上部署casserver的war包,需要配置使用者資料來源,根據需求修改登入頁面。
第一次前端跳**客戶端訪問應用系統,應用系統判斷session發現未登入,返回302跳轉到sso登入頁面,並傳遞service引數給sso,該service引數有兩個作用:
第二次前端跳**瀏覽器顯示登入頁面,使用者輸入賬號密碼登入成功後,sso會返回302跳轉回到原來請求的應用系統頁面,並攜帶ticket引數,作為認證票據,同時通過set-cookie向瀏覽器記錄tgt,(tgt的作用將在下乙個應用系統需要登入的時候體現出作用,是避免重複登入的關鍵)
一次後台驗證:應用系統接收到帶有ticket的請求後,從後台直接向sso伺服器發起乙個http請求,將service和ticket作為引數,用於驗證ticket的有效性;如果ticket有效,sso伺服器將返回該ticket對應的登入使用者名稱。
當使用者已經登入過乙個應用系統以後,在同乙個瀏覽器上訪問第二個應用系統,根據單點登入的要求此時不應該再登入,而是直接進入第二個系統。但是實際上還是需要經過兩次前端跳轉、一次後端驗證,只不過此時的兩次跳轉是連續的,中間不會再出現登陸頁面,使用者感受不到。判斷的依據就是前面第4步通過set-cookie儲存到客戶端的tgt(ticket granted cookie )。
相比首次訪問,少了之前的第3步(不需要再出現登入頁面),因為此時在第二步跳轉時,攜帶了之前儲存的tgt,cas服務端通過tgt可以得知使用者資訊,因此直接生成ticket返回給應用系統。所以此時是兩次連續的302跳轉,使用者看到的效果就是直接進入第二個應用系統了。
異常現象說明:某專案前後端分開部署出現這樣乙個現象,前端對映網域名稱為後端對映網域名稱為單獨訪問後端登入沒有任何問題,但是訪問前端登陸後介面出現反覆跳轉不停重新整理的問題。
異常排查:迴圈跳轉原理,sso登入後返回應用系統,應用系統後台認證獲取使用者資訊存入session,由於某種原因造成session資訊丟失,導致應用系統認為還未登入,於是又跳轉sso,此時sso已經登入不會再出登陸頁面,直接生成ticket返回應用系統,應用系統session再次丟失,進入反覆跳轉認證的死迴圈,前端介面表現為不停的重新整理。
因此關鍵問題在於分析session資訊丟失的原因,一般來講有兩種可能:1是系統本身邏輯問題把之前寫入session的登入資訊清空了,2是兩個站點的cookie作用域相同而相互覆蓋,從而導致後台session被重置。
分析發現該專案屬於第二種情況,前後端cookie都在域下面,解決辦法修改cookie作用域或者修改cookie中jsessionid的命名,防止相互覆蓋。
單點登入原理
單點登入sso single sign on 說得簡單點就是在乙個多系統共存的環境下,使用者在一處登入後,就不用在其他系統中登入,也就是使用者的一次登入能得到其他所有系統的信任。單點登入在大型 裡使用得非常頻繁,例如像阿里巴巴這樣的 在 的背後是成百上千的子系統,使用者一次操作或交易可能涉及到幾十個...
單點登入原理
1 為什麼要有單點登入。以往登入乙個系統使用session登入,但是隨著系統的完善和優化,模組與模組之間可能存放在不同的伺服器,中間使用 伺服器來分發例如 nginx。但是多伺服器是如何共享使用者資訊的呢?答案就是單點登入。2 解決方式。這裡的單點登陸在nginx集群的時候最常用 解決方式 1 se...
單點登入原理
問題 採用將session儲存到一台伺服器的做法,在大型 構建中,是不合理的,因為session資料不同的伺服器之間不能共享,會導致使用者在訪問 時,會有很多次的校驗,如果該伺服器中沒有使用者資訊,則會出現使用者重複登入的問題 session不能共享!解決 1.使用者輸入使用者名稱和密碼 2.當前臺...