CAS單點(diǎn)登錄原理解析(轉(zhuǎn)載)

1承边、基于Cookie的單點(diǎn)登錄的回顧


基于Cookie的單點(diǎn)登錄核心原理:

? ? ? 將用戶名密碼加密之后存于Cookie中润努,之后訪問網(wǎng)站時(shí)在過濾器(filter)中校驗(yàn)用戶權(quán)限,如果沒有權(quán)限則從Cookie中取出用戶名密碼進(jìn)行登錄双霍,讓用戶從某種意義上覺得只登錄了一次。

? ? ? 該方式缺點(diǎn)就是多次傳送用戶名密碼,增加被盜風(fēng)險(xiǎn)栅屏,以及不能跨域。同時(shí)www.qiandu.com與mail.qiandu.com同時(shí)擁有登錄邏輯的代碼堂鲜,如果涉及到修改操作栈雳,則需要修改兩處。


2缔莲、統(tǒng)一認(rèn)證中心方案原理

? ? ? 在生活中我們也有類似的相關(guān)生活經(jīng)驗(yàn)哥纫,例如你去食堂吃飯,食堂打飯的阿姨(www.qiandu.com)告訴你痴奏,不收現(xiàn)金蛀骇。并且告訴你,你去門口找換票的(passport.com)換小票读拆。于是你換完票之后擅憔,再去找食堂阿姨,食堂阿姨拿著你的票檐晕,問門口換票的暑诸,這個(gè)票是真的嗎?換票的說辟灰,是真的个榕,于是給你打飯了。

? ? ? 基于上述生活中的場(chǎng)景芥喇,我們將基于Cookie的單點(diǎn)登錄改良以后的方案如下:


經(jīng)過分析笛洛,Cookie單點(diǎn)登錄認(rèn)證太過于分散,每個(gè)網(wǎng)站都持有一份登陸認(rèn)證代碼乃坤。于是我們將認(rèn)證統(tǒng)一化苛让,形成一個(gè)獨(dú)立的服務(wù)。當(dāng)我們需要登錄操作時(shí)湿诊,則重定向到統(tǒng)一認(rèn)證中心http://passport.com狱杰。于是乎整個(gè)流程就如上圖所示:

第一步:用戶訪問www.qiandu.com。過濾器判斷用戶是否登錄厅须,沒有登錄仿畸,則重定向(302)到網(wǎng)站http://passport.com。

第二步:重定向到passport.com,輸入用戶名密碼错沽。passport.com將用戶登錄的信息記錄到服務(wù)器的session中簿晓。

第三步:passport.com給瀏覽器發(fā)送一個(gè)特殊的憑證,瀏覽器將憑證交給www.qiandu.com千埃,www.qiandu.com則拿著瀏覽器交給他的憑證去passport.com驗(yàn)證憑證是否有效憔儿,從而判斷用戶是否登錄成功。

第四步:登錄成功放可,瀏覽器與網(wǎng)站之間進(jìn)行正常的訪問谒臼。


3、Yelu大學(xué)研發(fā)的CAS(Central Authentication Server)

下面就以耶魯大學(xué)研發(fā)的CAS為分析依據(jù)耀里,分析其工作原理蜈缤。首先看一下最上層的項(xiàng)目部署圖:


部署項(xiàng)目時(shí)需要部署一個(gè)獨(dú)立的認(rèn)證中心(cas.qiandu.com),以及其他N個(gè)用戶自己的web服務(wù)冯挎。

認(rèn)證中心:也就是cas.qiandu.com底哥,即cas-server。用來提供認(rèn)證服務(wù)房官,由CAS框架提供趾徽,用戶只需要根據(jù)業(yè)務(wù)實(shí)現(xiàn)認(rèn)證的邏輯即可。

用戶web項(xiàng)目:只需要在web.xml中配置幾個(gè)過濾器易阳,用來保護(hù)資源附较,過濾器也是CAS框架提供了吃粒,即cas-client潦俺,基本不需要改動(dòng)可以直接使用。


4徐勃、CAS的詳細(xì)登錄流程


上圖是3個(gè)登錄場(chǎng)景,分別為:第一次訪問www.qiandu.com、第二次訪問讥巡、以及登錄狀態(tài)下第一次訪問mail.qiandu.com缅叠。

下面就詳細(xì)說明上圖中每個(gè)數(shù)字標(biāo)號(hào)做了什么,以及相關(guān)的請(qǐng)求內(nèi)容臀脏,響應(yīng)內(nèi)容劝堪。


4.1、第一次訪問www.qiandu.com

標(biāo)號(hào)1:用戶訪問http://www.qiandu.com揉稚,經(jīng)過他的第一個(gè)過濾器(cas提供秒啦,在web.xml中配置)AuthenticationFilter。

? ? ? 過濾器全稱:org.jasig.cas.client.authentication.AuthenticationFilter

? ? ? 主要作用:判斷是否登錄搀玖,如果沒有登錄則重定向到認(rèn)證中心余境。

標(biāo)號(hào)2:www.qiandu.com發(fā)現(xiàn)用戶沒有登錄,則返回瀏覽器重定向地址。


? ? ? 首先可以看到我們請(qǐng)求www.qiandu.com芳来,之后瀏覽器返回狀態(tài)碼302含末,然后讓瀏覽器重定向到cas.qiandu.com并且通過get的方式添加參數(shù)service,該參數(shù)目的是登錄成功之后會(huì)要重定向回來即舌,因此需要該參數(shù)佣盒。并且你會(huì)發(fā)現(xiàn),其實(shí)server的值就是編碼之后的我們請(qǐng)求www.qiandu.com的地址侥涵。

標(biāo)號(hào)3:瀏覽器接收到重定向之后發(fā)起重定向沼撕,請(qǐng)求cas.qiandu.com。

標(biāo)號(hào)4:認(rèn)證中心cas.qiandu.com接收到登錄請(qǐng)求芜飘,返回登陸頁面务豺。


? ? ? 上圖就是標(biāo)號(hào)3的請(qǐng)求,以及標(biāo)號(hào)4的響應(yīng)嗦明。請(qǐng)求的URL是標(biāo)號(hào)2返回的URL笼沥。之后認(rèn)證中心就展示登錄的頁面,等待用戶輸入用戶名密碼娶牌。

標(biāo)號(hào)5:用戶在cas.qiandu.com的login頁面輸入用戶名密碼奔浅,提交。

標(biāo)號(hào)6:服務(wù)器接收到用戶名密碼诗良,則驗(yàn)證是否有效汹桦,驗(yàn)證邏輯可以使用cas-server提供現(xiàn)成的,也可以自己實(shí)現(xiàn)鉴裹。


? ? ? 上圖就是標(biāo)號(hào)5的請(qǐng)求舞骆,以及標(biāo)號(hào)6的響應(yīng)了。當(dāng)cas.qiandu.com即csa-server認(rèn)證通過之后径荔,會(huì)返回給瀏覽器302督禽,重定向的地址就是Referer中的service參數(shù)對(duì)應(yīng)的值。后邊并通過get的方式挾帶了一個(gè)ticket令牌总处,這個(gè)ticket就是ST(數(shù)字3處)狈惫。同時(shí)會(huì)在Cookie中設(shè)置一個(gè)CASTGC,該cookie是網(wǎng)站cas.qiandu.com的cookie鹦马,只有訪問這個(gè)網(wǎng)站才會(huì)攜帶這個(gè)cookie過去胧谈。

? ? ??Cookie中的CASTGC:向cookie中添加該值的目的是當(dāng)下次訪問cas.qiandu.com時(shí),瀏覽器將Cookie中的TGC攜帶到服務(wù)器荸频,服務(wù)器根據(jù)這個(gè)TGC菱肖,查找與之對(duì)應(yīng)的TGT。從而判斷用戶是否登錄過了试溯,是否需要展示登錄頁面蔑滓。TGT與TGC的關(guān)系就像SESSION與Cookie中SESSIONID的關(guān)系。

? ? ??TGT:Ticket Granted Ticket(俗稱大令牌,或者說票根键袱,他可以簽發(fā)ST)

? ? ??TGC:Ticket Granted Cookie(cookie中的value)燎窘,存在Cookie中,根據(jù)他可以找到TGT蹄咖。

? ? ??ST:Service Ticket (小令牌)褐健,是TGT生成的,默認(rèn)是用一次就生效了澜汤。也就是上面數(shù)字3處的ticket值蚜迅。

標(biāo)號(hào)7:瀏覽器從cas.qiandu.com哪里拿到ticket之后,就根據(jù)指示重定向到www.qiandu.com俊抵,請(qǐng)求的url就是上面返回的url谁不。


標(biāo)號(hào)8:www.qiandu.com在過濾器中會(huì)取到ticket的值,然后通過http方式調(diào)用cas.qiandu.com驗(yàn)證該ticket是否是有效的徽诲。

標(biāo)號(hào)9:cas.qiandu.com接收到ticket之后刹帕,驗(yàn)證,驗(yàn)證通過返回結(jié)果告訴www.qiandu.com該ticket有效谎替。

標(biāo)號(hào)10:www.qiandu.com接收到cas-server的返回偷溺,知道了用戶合法,展示相關(guān)資源到用戶瀏覽器上钱贯。


? ? ? 至此挫掏,第一次訪問的整個(gè)流程結(jié)束,其中標(biāo)號(hào)8與標(biāo)號(hào)9的環(huán)節(jié)是通過代碼調(diào)用的秩命,并不是瀏覽器發(fā)起尉共,所以沒有截取到報(bào)文。


4.2硫麻、第二次訪問www.qiandu.com

上面以及訪問過一次了爸邢,當(dāng)?shù)诙卧L問的時(shí)候發(fā)生了什么呢樊卓?

標(biāo)號(hào)11:用戶發(fā)起請(qǐng)求拿愧,訪問www.qiandu.com。會(huì)經(jīng)過cas-client碌尔,也就是過濾器浇辜,因?yàn)榈谝淮卧L問成功之后www.qiandu.com中會(huì)在session中記錄用戶信息,因此這里直接就通過了唾戚,不用驗(yàn)證了柳洋。

標(biāo)號(hào)12:用戶通過權(quán)限驗(yàn)證,瀏覽器返回正常資源叹坦。


4.3熊镣、訪問mail.qiandu.com

標(biāo)號(hào)13:用戶在www.qiandu.com正常上網(wǎng),突然想訪問mail.qiandu.com,于是發(fā)起訪問mail.qiandu.com的請(qǐng)求绪囱。

標(biāo)號(hào)14:mail.qiandu.com接收到請(qǐng)求测蹲,發(fā)現(xiàn)第一次訪問,于是給他一個(gè)重定向的地址鬼吵,讓他去找認(rèn)證中心登錄扣甲。


? ? ? 上圖可以看到,用戶請(qǐng)求mail.qiandu.com齿椅,然后返回給他一個(gè)網(wǎng)址琉挖,狀態(tài)302重定向,service參數(shù)就是回來的地址涣脚。

標(biāo)號(hào)15:瀏覽器根據(jù)14返回的地址示辈,發(fā)起重定向,因?yàn)橹霸L問過一次了遣蚀,因此這次會(huì)攜帶上次返回的Cookie:TGC到認(rèn)證中心顽耳。

標(biāo)號(hào)16:認(rèn)證中心收到請(qǐng)求,發(fā)現(xiàn)TGC對(duì)應(yīng)了一個(gè)TGT妙同,于是用TGT簽發(fā)一個(gè)ST射富,并且返回給瀏覽器,讓他重定向到mail.qiandu.com


? ? ? 可以發(fā)現(xiàn)請(qǐng)求的時(shí)候是攜帶Cookie:CASTGC的粥帚,響應(yīng)的就是一個(gè)地址加上TGT簽發(fā)的ST也就是ticket胰耗。

標(biāo)號(hào)17:瀏覽器根據(jù)16返回的網(wǎng)址發(fā)起重定向。

標(biāo)號(hào)18:mail.qiandu.com獲取ticket去認(rèn)證中心驗(yàn)證是否有效芒涡。

標(biāo)號(hào)19:認(rèn)證成功柴灯,返回在mail.qiandu.com的session中設(shè)置登錄狀態(tài),下次就直接登錄费尽。

標(biāo)號(hào)20:認(rèn)證成功之后就反正用想要訪問的資源了赠群。



5、總結(jié)

? ? ? 至此旱幼,CAS登錄的整個(gè)過程就完畢了查描。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市柏卤,隨后出現(xiàn)的幾起案子冬三,更是在濱河造成了極大的恐慌,老刑警劉巖缘缚,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勾笆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡桥滨,警方通過查閱死者的電腦和手機(jī)窝爪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門弛车,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蒲每,你說我怎么就攤上這事帅韧。” “怎么了啃勉?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵忽舟,是天一觀的道長。 經(jīng)常有香客問我淮阐,道長叮阅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任泣特,我火速辦了婚禮浩姥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘状您。我一直安慰自己勒叠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布膏孟。 她就那樣靜靜地躺著眯分,像睡著了一般。 火紅的嫁衣襯著肌膚如雪柒桑。 梳的紋絲不亂的頭發(fā)上弊决,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音魁淳,去河邊找鬼飘诗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛界逛,可吹牛的內(nèi)容都是我干的昆稿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼息拜,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼溉潭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起该溯,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤岛抄,失蹤者是張志新(化名)和其女友劉穎别惦,沒想到半個(gè)月后狈茉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡掸掸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年氯庆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蹭秋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡堤撵,死狀恐怖仁讨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情实昨,我是刑警寧澤洞豁,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站荒给,受9級(jí)特大地震影響丈挟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜志电,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一曙咽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧挑辆,春花似錦例朱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至魁亦,卻和暖如春烁竭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吉挣。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國打工派撕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人睬魂。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓终吼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親氯哮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子际跪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容