一、何謂單點(diǎn)登錄
單點(diǎn)登錄(Single Sign On)组橄,簡(jiǎn)稱(chēng)為SSO荞膘,簡(jiǎn)單理解就是在多個(gè)應(yīng)用系統(tǒng)中,用戶只需要登錄一次就可以訪問(wèn)所有相互信任的應(yīng)用系統(tǒng)玉工。
二羽资、何謂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ò)之后組裝生成的。
四飞蛹、實(shí)現(xiàn)原理
假設(shè)我們現(xiàn)在有應(yīng)用系統(tǒng)A谤狡、應(yīng)用系統(tǒng)B灸眼、CAS認(rèn)證系統(tǒng)
1、第一次訪問(wèn)系統(tǒng)A時(shí)墓懂,沒(méi)有票據(jù)(ST)焰宣,也沒(méi)有session,會(huì)重定向到CAS服務(wù)器捕仔,要求用戶輸入用戶名和密碼匕积,之后CAS向?yàn)g覽器寫(xiě)入TGC,同時(shí)生成TGT保存到緩存榜跌,CAS服務(wù)器會(huì)根據(jù)TGT生成ST闪唆,然后CAS會(huì)重定向到給應(yīng)用系統(tǒng)A,CAS將這個(gè)ST和成功登錄的用戶斜做,以及服務(wù)聯(lián)系在一起苞氮。這個(gè)ST使用次數(shù)(numberOfUses)和有效時(shí)間(timeToKill)是可配置的湾揽,超過(guò)設(shè)置的次數(shù)或者超過(guò)有效時(shí)間就會(huì)失效瓤逼。
2、應(yīng)用系統(tǒng)A收到這個(gè)ST之后库物,它并不知道這個(gè)用戶已經(jīng)登錄成功霸旗,就通過(guò)將ST傳遞給一個(gè)校驗(yàn)URL,校驗(yàn)URL拿到Cas系統(tǒng)去驗(yàn)證戚揭,CAS通過(guò)驗(yàn)證之后返回用戶信息诱告,并且將ST作廢。
3民晒、應(yīng)用系統(tǒng)A根據(jù)從CAS收到的用戶信息將session創(chuàng)建起來(lái)精居,這樣我們的應(yīng)用就擁有了一個(gè)自己的session。
4潜必、第一次訪問(wèn)另一個(gè)應(yīng)用系統(tǒng)B靴姿,也是沒(méi)有票據(jù)(ST),也沒(méi)有session磁滚,會(huì)再次被重定向到CAS系統(tǒng)佛吓,CAS系統(tǒng)會(huì)去獲得TGC,如果該TGC沒(méi)有失效垂攘,則拿到TGT生成ST給用戶重定向到系統(tǒng)B维雇,系統(tǒng)B拿到ST之后再去CAS系統(tǒng)驗(yàn)證(同應(yīng)用系統(tǒng)B的驗(yàn)證方式),驗(yàn)證成功則創(chuàng)建session晒他;如果TGC失效吱型,那么用戶還是要重新認(rèn)證。
5陨仅、再去訪問(wèn)系統(tǒng)A時(shí)津滞,沒(méi)有票據(jù)耕陷,因?yàn)槠睋?jù)只能用一次,但是我們有session据沈,所以不用跳轉(zhuǎn)到CAS去簽發(fā)票據(jù)了哟沫,直接允許用戶訪問(wèn)。
6锌介、用戶登出的時(shí)候嗜诀,CAS系統(tǒng)接受請(qǐng)求后,會(huì)檢測(cè)用戶的TGC孔祸,把對(duì)應(yīng)的session清除隆敢,同時(shí)會(huì)找到所有通過(guò)該TGC進(jìn)行SSO登錄的應(yīng)用服務(wù)器URL提交請(qǐng)求,所有的回調(diào)請(qǐng)求中崔慧,包含一個(gè)參數(shù)logoutRequest拂蝎,內(nèi)容格式如下:
@NOT_USED@
[SESSIONIDENTIFIER]
所有收到請(qǐng)求的應(yīng)用服務(wù)器會(huì)解析這個(gè)參數(shù),取得sessionId惶室,根據(jù)這個(gè)Id取得session后温自,把session清除。
四皇钞、列舉點(diǎn)融網(wǎng)統(tǒng)一驗(yàn)證中心后端的一個(gè)例子
現(xiàn)有兩個(gè)系統(tǒng)悼泌,一個(gè)是techops應(yīng)用系統(tǒng),是web界面的管理控制臺(tái)夹界,通過(guò)techops錄入資源馆里,角色,做權(quán)限分配可柿。
另一個(gè)是cas系統(tǒng)鸠踪,即我們的單點(diǎn)登錄系統(tǒng),各個(gè)子應(yīng)用系統(tǒng)通過(guò)cas做sso認(rèn)證复斥。
1营密、我在本地部署起來(lái)兩個(gè)系統(tǒng)之后,第一次訪問(wèn)techops應(yīng)用系統(tǒng)http://localhost:8143/techops/永票,此時(shí)我們沒(méi)有票據(jù)卵贱,也沒(méi)有session會(huì)重定向到CAS系統(tǒng)。
CAS統(tǒng)一認(rèn)證登錄界面如下侣集,我們看到的鏈接是:http://localhost:8142/cas/login?service=http%3A%2F%2Flocalhost%3A8143%2Ftechops%2Flogin%2Fcas
后面加入了一個(gè)service键俱,通過(guò)decodeURIComponent('http%3A%2F%2Flocalhost%3A8143%2Ftechops%2Flogin%2Fcas');解析之后的樣子:"http://localhost:8143/techops/login/cas",就是在用戶登錄成功之后跳轉(zhuǎn)的URL世分。
2编振、我們輸入用戶名和密碼,登錄成功之后,會(huì)跳轉(zhuǎn)到techops系統(tǒng)踪央,攜帶了一個(gè)ticket = ST-1-oYYmrbiaZ7LnFlA77rfr-cas01.dianrong.com(隨機(jī)生成)臀玄,同時(shí)我們也看到了CAS向?yàn)g覽器寫(xiě)入了TGC。
techops系統(tǒng)界面如下:
3畅蹂、下次我們?cè)偃ピL問(wèn)http://localhost:8143/techops健无,就不會(huì)去簽發(fā)ticket了,此時(shí)techops已經(jīng)根據(jù)從CAS返回的用戶信息將session創(chuàng)建起來(lái)液斜,我們的session是已經(jīng)有信息了累贤,瀏覽器后臺(tái)是看不到重定向到CAS系統(tǒng)去驗(yàn)證這些流程了。
本文作者:鄧海波少漆,90后IT小猿一枚臼膏,平時(shí)喜歡看看電影玩玩LOL。目前就職于點(diǎn)融成都分公司架構(gòu)團(tuán)隊(duì)示损,軟件開(kāi)發(fā)工程師渗磅。