Cas術語JAVA單點登錄有好多種方式,譬如用cookie的domain做,用中間代理做等等,但都需要自行做許多開發工作。而其中耶魯大學的開源項目CAS提供了一個一站式解決方案,只需很少的擴展即可輕松實現企業級單點登錄。基礎知識網上其他挺多的,這里我就不詳述了。本文通過分析http請求過程中http
header,cookie等數據剖析了cas(非代理模式,默認驗證邏輯。其他如restletAPI等可擴展邏輯本文不會覆蓋)的驗證流程,在開發調試中提供了另一種方便的方式掌控整個流程的關鍵點。
TGT: ?cas服務端生成的每個用戶唯一的ticket。
TGC: ?cas服務端根據TGT生成的每個用戶的cookie,其value是TGT。
ST: ???cas服務端根據每個應用,每個用戶生成的一個ticket,驗證一次就銷毀。
Shiro: JAVA權限管理框架
Cas請求交互總圖下面將通過兩個客戶端應用A、B分別跟cas server端交互來詳述整個交互流程。本文基于CAS 4.x。 CAS 5.X默認邏輯一致,只不過通過spring boot進行了重新模塊劃分。
客戶端應用A訪問跳轉Cas Server驗證http request: GET ?http://uc.54315.com/myWhListManager http response: 302 Found Location:?https://passport.jzt.com/login?service=http://uc.54315.com/casuc
Cas client攔截請求發現session中無cas assertion(其實就是用戶名和ticket)并且沒有ST則跳轉CAS server(本項目由于用了shiro重寫攔截邏輯所以是判斷shiro中有沒有保存驗證后的用戶信息), server端發現無TGC跳轉配置的CAS登陸URL
Cas server端登陸后http請求過程1. post提交用戶信息驗證:
http request: Post?https://passport.jzt.com/login?service=http://uc.54315.com/casuc http response: 302 Found Location:http://uc.54315.com/casuc?ticket=ST-1-0kdGxVoshSZz2Bp6kMaA- cas01.example.org
Response返回302指示重定向。同時可見response返回兩個cookie: CASPRIVACY=和CASTGC=TGT-1-MRebCegmlpucavmxcPqCUMVc496IiJgl06BGyJ736D7c4UPkCw-cas01.example.org
也就是說:cas server端驗證通過后產生ST并在location URL后面賦給ticket。此時往客戶端瀏覽器寫入TGC,并且指示瀏覽器重定向到location位置,其正是客戶端應用驗證ST的路徑。
此步驟產生2個ticket: TGT,ST;產生一個cookie:TGC,此cookie是通過用戶私密信息與TGT加密生成。
2. Cas client驗證ST:
http request: Get ?http://uc.54315.com/casuc?ticket=ST-1-0kdGxVoshSZz2Bp6kMaA-cas01.example.org
此時客戶端應用由于受到shiro的保護,request cookie中就不是JSESSIONID而是shiro的SessionId:sid,uuid模式,其與第一步中的sid一致。
http response: 302Found Location:http://uc.54315.com/myWhListManager;jsessionid=qqwn1wmrsymy47n8udvf7v2s
Response返回302指示重定向到另一個頁面(第一次訪問的頁面或者shiro配置的successful url),同時可見生成了新的session和sessionID。同時可見response返回2個cookie:? JSESSIONID,為servlet容器產生的session id,其為location中的jsessionid;rememberMe,為shiro為自動登錄配置的。
此步驟驗證ST后(通過url connection去cas server驗證ST)如果通過則重定向到新頁面(第一次訪問的頁面或者shiro配置的successful url)產生一個新的容器session id。(為何要重新創建session,因為其會在新的session中保存登陸了客戶端應用的憑證CAS Assertion,其為客戶端驗證ST后返回的)到了這步驟以后屬于客戶端自身的邏輯。CAS作用到此為止。
3. 客戶端應用頁面
客戶端應用A再次訪問http request: Get http://uc.54315.com/getUcUserRegister
http response: 200 OK
可以看到這次直接就訪問了,也沒有經過驗證ticket和與cas服務端交互。此是因為session中已經保存了cas assertion,所以算作登陸了。
客戶端應用B訪問1. 訪問B應用首頁
http request: Get http://localhost:8080/
http response: 302 Found Location:?https://passport.jzt.com/login?service=http://localhost:8080/casuc
可見產生了新的shiro session,并提示跳轉CAS服務端登陸URL。
2. 訪問CAS服務器登陸URL
http request: Get https://passport.jzt.com/login?service=http://localhost:8080/casuc
http response: 302 Found Location:?http://localhost:8080/casuc?ticket=ST-2-wtWpPg2Sv4d00fXecLSI-cas01.example.org
可見并沒有要求登陸而是直接就提示跳轉到location的URL做驗證并產生了一個新的ST。這是因為CAS服務端讀取了A應用登陸后在瀏覽器生成的TGC, request cookie中帶入了(下圖可以看到),從而認為用戶已經登陸,所以直接生成ST,并要求重定向到客戶端應用B去驗證。
3. 驗證ST
http request: Get ?http://localhost:8080/casuc?ticket=ST-2-wtWpPg2Sv4d00fXecLSI-cas01.example.org http response: 302 Found Location:?http://localhost:8080/;jsessionid=1jh99lja6wzxw1jweg8ss40yt8
步驟同A應用。
4. 訪問B應用首頁
如圖
客戶端應用A退出如下圖:
可見登出時發生四次請求。
1. 第一次請求:
http request: GET ?https://passport.jzt.com/logout?service=http://uc.54315.com:80/logout http response: 302 Found Location:?http://uc.54315.com:80/logout
直接訪問CAS server端的登出url。Cookie中有CASTGC和server端的JSESSIONID。
返回中CASTGC清空,CASPRIVACY清空。 此時說明server端已經清除了A應用的ST和瀏覽器的CASTGC
2. 第二次請求:
http request: Get ?http://uc.54315.com/logout http response: 302 Found Location:?http://uc.54315.com/
跳轉到了客戶端應用,發現新創建了shiro session(sid)和servlet容器session(JSESSIONID)
并且發現rememberMe和SID的cookie都被換成deleteMe啦。 此為shiro的loginout攔截器干的好事。
3. 第三次請求:
http request: Get?http://uc.54315.com/ http response: 302 Found Location: https://passport.jzt.com/login?service=http://uc.54315.com/casuc
正常訪問首頁,但是因為沒登陸所以提示要重定向到CAS服務端去登陸。(如果有了首頁就改為跳轉到首頁)
4. 第四次請求
同原來步驟。
Cas總結總的來說,cas(非代理模式,默認驗證邏輯)是用一個cookie(TGC), N個session(N個子系統session,其中存儲了cas receipt)來保證各應用的統一登錄。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/67359.html
摘要:針對這種情況,友戶通特定開發了聯邦用戶中心來支持企業的自有用戶中心。友戶通支持通過協議使用企業內部的支持協議的用戶中心賬號進行登錄。友戶通目前支持標準協議以及友戶通自定義協議可供企業集成。 友戶通做用友云的用戶系統也一年多了,經常聽實施、售前等說要私有化部署友戶通,原因無非是企業的考慮到用戶安全性和單一用戶賬號的需求。但由于用戶管理的復雜性,友戶通部署與維護并不容易,因此經常糾結在用戶...
摘要:是大學發起的一個企業級的開源的項目,旨在為應用系統提供一種可靠的單點登錄解決方法屬于。實現原理是先通過的認證,然后向申請一個針對于的,之后在訪問時把申請到的針對于的以參數傳遞過去。后面的流程與上述流程步驟及以后步驟類似 CAS( Central Authentication Service )是 Yale 大學發起的一個企業級的、開源的項目,旨在為 Web 應用系統提供一種可靠的單點登...
摘要:上一篇文章簡單介紹了在本地開發環境中搭建服務端和客戶端,對單點登錄過程有了一個直觀的認識之后,本篇將探討單點登錄的實現原理。因此引入服務端作為用戶信息鑒別和傳遞中介,達到單點登錄的效果。為該流程的實現類。表示對返回結果的處理。 上一篇文章簡單介紹了 CAS 5.2.2 在本地開發環境中搭建服務端和客戶端,對單點登錄過程有了一個直觀的認識之后,本篇將探討 CAS 單點登錄的實現原理。 一...
摘要:此時,用戶想要訪問系統受限的資源比如說訂單功能,訂單功能需要登錄后才能訪問,系統發現用戶并沒有登錄,于是重定向到認證中心,并將自己的地址作為參數。 前言 只有光頭才能變強。文本已收錄至我的GitHub倉庫,歡迎Star:https://github.com/ZhongFuCheng3y/3y 在我實習之前我就已經在看單點登錄的是什么了,但是實習的時候一直在忙其他的事,所以有幾個網站就...
閱讀 2323·2021-10-08 10:04
閱讀 1097·2021-09-03 10:40
閱讀 1150·2019-08-30 15:53
閱讀 3309·2019-08-30 13:13
閱讀 2925·2019-08-30 12:55
閱讀 2278·2019-08-29 13:21
閱讀 1330·2019-08-26 12:12
閱讀 2755·2019-08-26 10:37