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