一蝌箍、什么是單點(diǎn)登錄芭碍?
單點(diǎn)登錄SSO(Single Sign On)說(shuō)得簡(jiǎn)單點(diǎn)就是在一個(gè)多系統(tǒng)共存的環(huán)境下,用戶在一處登錄后寞蚌,就不用在其他系統(tǒng)中登錄,也就是用戶的一次登錄能得到其他所有系統(tǒng)的信任钠糊。單點(diǎn)登錄在大型網(wǎng)站里使用得非常頻繁挟秤,例如像阿里巴巴這樣的網(wǎng)站,在網(wǎng)站的背后是成百上千的子系統(tǒng)抄伍,用戶一次操作或交易可能涉及到幾十個(gè)子系統(tǒng)的協(xié)作艘刚,如果每個(gè)子系統(tǒng)都需要用戶認(rèn)證,不僅用戶會(huì)瘋掉截珍,各子系統(tǒng)也會(huì)為這種重復(fù)認(rèn)證授權(quán)的邏輯搞瘋掉攀甚。
二箩朴、何謂CAS
CAS(Central Authentication Service)是耶魯大學(xué)的一個(gè)開(kāi)源項(xiàng)目,旨在為web應(yīng)用系統(tǒng)提供一種可靠的單點(diǎn)登錄解決方案秋度。采用CAS最大的是從安全性角度來(lái)考慮的炸庞,用戶在CAS錄入用戶名和密碼之后通過(guò)ticket進(jìn)行認(rèn)證,不會(huì)在網(wǎng)上傳輸密碼静陈,保證安全性燕雁。
三、CAS中的關(guān)鍵詞理解
ST(Service Ticket):服務(wù)票據(jù)鲸拥,服務(wù)的唯一標(biāo)識(shí)碼拐格,由TGT生成ST,返回給用戶刑赶,接著拿著生成 的ST去訪問(wèn)service捏浊,service又會(huì)把ST拿到CAS系統(tǒng)去驗(yàn)證,驗(yàn)證通過(guò)后才允許用戶訪問(wèn)該資源撞叨。
TGC( Ticket Granting Cookie):CAS系統(tǒng)用來(lái)識(shí)別用戶身份的憑證金踪。
TGT(Ticket Grangting Ticket):授權(quán)票據(jù),獲取這TGT之后才能申請(qǐng)服務(wù)票據(jù)(ST)牵敷,用戶如果在CAS系統(tǒng)認(rèn)證成功之后胡岔,就會(huì)生成TGC寫(xiě)入瀏覽器,同時(shí)也生成一個(gè)TGT枷餐,TGT對(duì)象的id就是cookie值靶瘸。之后每次請(qǐng)求過(guò)來(lái)通過(guò)此cookie來(lái)從緩存獲取TGT,就不用提交身份認(rèn)證信息(Credentials)毛肋。
Session:各個(gè)應(yīng)用系統(tǒng)會(huì)創(chuàng)建自己的session表示是否登錄怨咪,而這里的每個(gè)session都是ST驗(yàn)證通過(guò)之后組裝生成的。
四 润匙、基礎(chǔ)模式
SSO訪問(wèn)流程主要有以下步驟:
用戶首次登錄時(shí)流程如下:
1)诗眨、用戶瀏覽器訪問(wèn)系統(tǒng)A需登錄受限資源,此時(shí)進(jìn)行登錄檢查孕讳,發(fā)現(xiàn)未登錄匠楚,然后進(jìn)行獲取票據(jù)操作,發(fā)現(xiàn)沒(méi)有票據(jù)厂财。
2)油啤、系統(tǒng)A發(fā)現(xiàn)該請(qǐng)求需要登錄,將請(qǐng)求重定向到認(rèn)證中心蟀苛,獲取全局票據(jù)操作,沒(méi)有逮诲,進(jìn)行登錄帜平。
3)幽告、認(rèn)證中心呈現(xiàn)登錄頁(yè)面,用戶登錄裆甩,登錄成功后冗锁,認(rèn)證中心重定向請(qǐng)求到系統(tǒng)A,并附上認(rèn)證通過(guò)令牌嗤栓,此時(shí)認(rèn)證中心同時(shí)生成了全局票據(jù)冻河。
4)、此時(shí)再次進(jìn)行登錄檢查茉帅,發(fā)現(xiàn)未登錄叨叙,然后再次獲取票據(jù)操作,此時(shí)可以獲得票據(jù)(令牌)堪澎,系統(tǒng)A與認(rèn)證中心通信擂错,驗(yàn)證令牌有效,證明用戶已登錄。
5)樱蛤、系統(tǒng)A將受限資源返給用戶。
已登錄用戶首次訪問(wèn)應(yīng)用群中系統(tǒng)B時(shí):
1)、瀏覽器訪問(wèn)另一應(yīng)用B需登錄受限資源闷煤,此時(shí)進(jìn)行登錄檢查蔬崩,發(fā)現(xiàn)未登錄,然后進(jìn)行獲取票據(jù)操作便脊,發(fā)現(xiàn)沒(méi)有票據(jù)蚂四。
2)、系統(tǒng)B發(fā)現(xiàn)該請(qǐng)求需要登錄就轧,將請(qǐng)求重定向到認(rèn)證中心证杭,獲取全局票據(jù)操作,獲取全局票據(jù)妒御,可以獲得解愤,認(rèn)證中心發(fā)現(xiàn)已經(jīng)登錄。
3)乎莉、認(rèn)證中心發(fā)放臨時(shí)票據(jù)(令牌)送讲,并攜帶該令牌重定向到系統(tǒng)B。
4)惋啃、此時(shí)再次進(jìn)行登錄檢查哼鬓,發(fā)現(xiàn)未登錄,然后再次獲取票據(jù)操作边灭,此時(shí)可以獲得票據(jù)(令牌)异希,系統(tǒng)B與認(rèn)證中心通信,驗(yàn)證令牌有效,證明用戶已登錄绒瘦。
5)称簿、系統(tǒng)B將受限資源返回給客戶端扣癣。
五、cas登出流程
用戶發(fā)起登出請(qǐng)求動(dòng)作
APP將登出請(qǐng)求轉(zhuǎn)發(fā)到CAS Server的logou接口
CAS server接受請(qǐng)求后憨降,會(huì)檢測(cè)用戶的TGC Cookie是否存在父虑,如果存在即銷(xiāo)毀該用戶對(duì)應(yīng)的TGT和CAS服務(wù)器的session信息。
CAS Server根據(jù)登錄過(guò)的ServerURL向APP發(fā)出登出請(qǐng)求授药。
APP LogOut Filter會(huì)解析這個(gè)參數(shù)士嚎,取得sessionId,根據(jù)這個(gè)Id取得session后悔叽,把session刪除莱衩,將session中的Service Ticket清除掉。
六骄蝇、輔助說(shuō)明
CAS的SSO實(shí)現(xiàn)方式可簡(jiǎn)化理解為:1個(gè)Cookie和N個(gè)Session膳殷。CAS Server創(chuàng)建cookie,在所有應(yīng)用認(rèn)證時(shí)使用九火,各應(yīng)用通過(guò)創(chuàng)建各自的Session來(lái)標(biāo)識(shí)用戶是否已登錄赚窃。
用戶在一個(gè)應(yīng)用驗(yàn)證通過(guò)后,以后用戶在同一瀏覽器里訪問(wèn)此應(yīng)用時(shí)岔激,客戶端應(yīng)用中的過(guò)濾器會(huì)在session里讀取到用戶信息勒极,所以就不會(huì)去CAS Server認(rèn)證。如果在此瀏覽器里訪問(wèn)別的web應(yīng)用時(shí)虑鼎,客戶端應(yīng)用中的過(guò)濾器在session里讀取不到用戶信息辱匿,就會(huì)去CAS Server的login接口認(rèn)證,但這時(shí)CAS Server會(huì)讀取到瀏覽器傳來(lái)的cookie(TGC)炫彩,所以CAS Server不會(huì)要求用戶去登錄頁(yè)面登錄匾七,只是會(huì)根據(jù)service參數(shù)生成一個(gè)Ticket,然后再和web應(yīng)用做一個(gè)驗(yàn)證ticket的交互而已江兢。
七昨忆、對(duì)問(wèn)題的統(tǒng)一回答
1)、問(wèn):系統(tǒng)A是如何發(fā)現(xiàn)該請(qǐng)求需要登錄重定向到認(rèn)證中心的杉允?
答:用戶通過(guò)瀏覽器地址欄訪問(wèn)系統(tǒng)A邑贴,系統(tǒng)A(也可以稱(chēng)為CAS客戶端)去Cookie中拿JSESSION,即在Cookie中維護(hù)的當(dāng)前回話session的id叔磷,如果拿到了拢驾,說(shuō)明用戶已經(jīng)登錄,如果未拿到改基,說(shuō)明用戶未登錄繁疤。
2)、問(wèn):系統(tǒng)A重定向到認(rèn)證中心,發(fā)送了什么信息或者地址變成了什么嵌洼?
答:假如系統(tǒng)A的地址為http://a:8080/案疲,CAS認(rèn)證中心的服務(wù)地址為http://cas.server:8080/,那么重點(diǎn)向前后地址變化為:http://a:8080/————>ttp://cas.server:8080/?service=http://a:8080/麻养,由此可知,重點(diǎn)向到認(rèn)證中心诺舔,認(rèn)證中心拿到了當(dāng)前訪問(wèn)客戶端的地址鳖昌。
3)、問(wèn):登錄成功后低飒,認(rèn)證中心重定向請(qǐng)求到系統(tǒng)A许昨,認(rèn)證通過(guò)令牌是如何附加發(fā)送給系統(tǒng)A的?
答:重定向之后的地址欄變成:http://a:8080/?ticket=ST-XXXX-XXX褥赊,將票據(jù)以ticket為參數(shù)名的方式通過(guò)地址欄發(fā)送給系統(tǒng)A
4)糕档、問(wèn):系統(tǒng)A驗(yàn)證令牌,怎樣操作證明用戶登錄的拌喉?
答:系統(tǒng)A通過(guò)地址欄獲取ticket的參數(shù)值ST票據(jù)速那,然后從后臺(tái)將ST發(fā)送給CAS server認(rèn)證中心驗(yàn)證,驗(yàn)證ST有效后尿背,CAS server返回當(dāng)前用戶登錄的相關(guān)信息端仰,系統(tǒng)A接收到返回的用戶信息,并為該用戶創(chuàng)建session會(huì)話田藐,會(huì)話id由cookie維護(hù)荔烧,來(lái)證明其已登錄。
5)汽久、問(wèn):登錄B系統(tǒng)鹤竭,認(rèn)證中心是如何判斷用戶已經(jīng)登錄的?
答:在系統(tǒng)A登錄成功后景醇,用戶和認(rèn)證中心之間建立起了全局會(huì)話臀稚,這個(gè)全局會(huì)話就是TGT(Ticket Granting Ticket),TGT位于CAS服務(wù)器端啡直,TGT并沒(méi)有放在Session中烁涌,也就是說(shuō),CAS全局會(huì)話的實(shí)現(xiàn)并沒(méi)有直接使用Session機(jī)制酒觅,而是利用了Cookie自己實(shí)現(xiàn)的撮执,這個(gè)Cookie叫做TGC(Ticket Granting Cookie),它存放了TGT的id,保存在用戶瀏覽器上舷丹。
相關(guān)內(nèi)容分析可以查看:《SSO CAS單點(diǎn)系列》之 實(shí)操抒钱!輕松玩轉(zhuǎn)SSO CAS就這么簡(jiǎn)單(相識(shí)篇)
用戶發(fā)送登錄系統(tǒng)B的請(qǐng)求,首先會(huì)去Cookie中拿JSESSION,因?yàn)橄到y(tǒng)B并未登錄過(guò)谋币,session會(huì)話還未創(chuàng)建仗扬,JSESSION的值是拿不到的,然后將請(qǐng)求重定向到CAS認(rèn)證中心蕾额,CAS認(rèn)證中心先去用戶瀏覽器中拿TGC的值早芭,也就是全局會(huì)話id,如果存在則代表用戶在認(rèn)證中心已經(jīng)登錄诅蝶,附帶上認(rèn)證令牌重定向到系統(tǒng)B退个。
上面登錄狀態(tài)判斷也是這個(gè)邏輯。
6)调炬、問(wèn):登出的過(guò)程语盈,各個(gè)系統(tǒng)對(duì)當(dāng)前用戶都做了什么?
答:認(rèn)證中心清除當(dāng)前用戶的全局會(huì)話TGT缰泡,同時(shí)清掉cookie中TGT的id:TGC刀荒;
然后是各個(gè)客戶端系統(tǒng),比如系統(tǒng)A棘钞、系統(tǒng)B缠借,清除局部會(huì)話session,同時(shí)清掉cookie中session會(huì)話id:jsession
這篇文章先寫(xiě)到這里武翎,在下一篇文章我會(huì)詳細(xì)寫(xiě)下搭建cas服務(wù)器和客戶端的步驟