引言
CAS是耶魯大學(xué)發(fā)起的一個(gè)開(kāi)源單點(diǎn)登錄項(xiàng)目坎炼,也是用的最為廣泛的開(kāi)源項(xiàng)目。對(duì)于學(xué)習(xí)SSO有非常好的參考價(jià)值
什么是單點(diǎn)登錄
單點(diǎn)登錄(Single Sign On),簡(jiǎn)稱為 SSO。多用于多系統(tǒng)共存的環(huán)境下,用戶在一處登錄后绸吸,就不用在其他系統(tǒng)中登錄,最簡(jiǎn)單的單點(diǎn)登入實(shí)現(xiàn)可以完全基于cookie
设江,通過(guò)往瀏覽器寫(xiě)帶有登入信息的token來(lái)達(dá)到多點(diǎn)登入的目的锦茁,有興趣的可以自己動(dòng)手實(shí)現(xiàn)一個(gè)
CAS單點(diǎn)登入的實(shí)現(xiàn)
先盜個(gè)圖 :
從結(jié)構(gòu)上看,分成了三部分:CAS Client叉存,CAS Server码俩,瀏覽器
CAS Client 與受保護(hù)的客戶端應(yīng)用部署在一起,以 Filter 方式保護(hù) Web 應(yīng)用的受保護(hù)資源歼捏,過(guò)濾從客戶端過(guò)來(lái)的每一個(gè)Web請(qǐng)求
下面我將分為兩部分(用戶第一次登錄驗(yàn)證和之后的登錄驗(yàn)證)詳細(xì)解析其登入原理
用戶第一次登錄過(guò)程原理
-
CAS Client
會(huì)先根據(jù)JSESSIONID
(存在瀏覽器cookie中) 來(lái)判斷當(dāng)前訪問(wèn)用戶是否已經(jīng)登錄稿存,如果沒(méi)有JSESSIONID
會(huì)繼續(xù)分析 HTTP 請(qǐng)求中是否包含請(qǐng)求Service Ticket
( ST 上圖中的 Ticket) ,如果沒(méi)有瞳秽,則說(shuō)明該用戶是沒(méi)有經(jīng)過(guò)認(rèn)證的瓣履;于是CAS Client
會(huì)重定向用戶請(qǐng)求到CAS Server
,并傳遞Service
(要訪問(wèn)的目的資源地址) - 這時(shí)還沒(méi)有登錄過(guò)
CAS Server
练俐,進(jìn)入用戶認(rèn)證過(guò)程(返回登入界面) - 如果用戶認(rèn)證成功袖迎,
CAS Server
將隨機(jī)產(chǎn)生一個(gè)相當(dāng)長(zhǎng)度、唯一、不可偽造的Service Ticket
燕锥,并緩存以待將來(lái)驗(yàn)證辜贵,并且重定向用戶到 Service 所在地址(附帶剛才產(chǎn)生的 Service Ticket ) , 并為客戶端瀏覽器設(shè)置一個(gè)Ticket Granted Cookie
( TGC,該Cookie設(shè)置的是SSO Server
的域名) -
CAS Client
在拿到Service
和新產(chǎn)生的Ticket
過(guò)后归形,與CAS Server
通過(guò)拿到的Ticket
進(jìn)行身份核實(shí)托慨,以確保Service Ticket
的合法性。
以上是第一次驗(yàn)證時(shí)基本流程
當(dāng)?shù)诙悟?yàn)證時(shí)分兩種情況
- 同一個(gè)服務(wù)再次登錄
這里瀏覽器cookie
中會(huì)有sessionid
连霉,憑借這個(gè)sessionid
就不再需要去CAS Server
繼續(xù)認(rèn)證 - 另外一個(gè)未登錄過(guò)的服務(wù)登錄
在上面步驟中的第二歩榴芳,因?yàn)橹耙呀?jīng)在CAS Server
登錄成功過(guò)嗡靡,CAS Server
會(huì)讀取瀏覽器中的TGC
(cookie)跺撼,表明已經(jīng)登入過(guò),就不需要去返回登錄界面了讨彼,直接返回CAS Client 一個(gè)唯一 票據(jù)(ticket)歉井,并進(jìn)入第三歩。這樣就實(shí)現(xiàn)了單點(diǎn)登錄哈误,多點(diǎn)無(wú)需再次手動(dòng)登錄
關(guān)于跨域的實(shí)現(xiàn)
跨域的關(guān)鍵在于瀏覽器端的Cookie:TGC
哩至,因?yàn)檫@個(gè)Cookie是設(shè)置在SSO Server
端的,也就保證了統(tǒng)一票據(jù)和Client
端域名無(wú)關(guān)蜜自。
總結(jié)
cas 單點(diǎn)登錄核心就是 單個(gè)cookie
菩貌, N個(gè)session
- 單個(gè)
cookie(TGC)
在cas為各應(yīng)用登錄時(shí)使用,實(shí)現(xiàn)了只須一次錄入用戶密碼重荠,此cookie
只于cas server
相關(guān)箭阶,這也是cas
可以實(shí)現(xiàn)跨域的關(guān)鍵 - N個(gè)
session
各應(yīng)用會(huì)創(chuàng)建自己的session
表示是否登錄,如已登錄戈鲁,就不會(huì)去CAS Server 去驗(yàn)證TGC
在該協(xié)議中仇参,所有與 CAS Server 的交互均采用 SSL
協(xié)議,以確保 ST
和 TGC
的安全性婆殿。