基于Cookie的單點(diǎn)登錄核心原理:
將用戶名密碼加密之后存于Cookie中甘苍,之后訪問(wèn)網(wǎng)站時(shí)在過(guò)濾器(filter)中校驗(yàn)用戶權(quán)限,如果沒(méi)有權(quán)限則從Cookie中取出用戶名密碼進(jìn)行登錄马胧,讓用戶從某種意義上覺(jué)得只登錄了一次。
該方式缺點(diǎn)就是多次傳送用戶名密碼评肆,增加被盜風(fēng)險(xiǎn)歌径,以及不能跨域损合。同時(shí)www.qiandu.com與mail.qiandu.com同時(shí)擁有登錄邏輯的代碼,如果涉及到修改操作娘纷,則需要修改兩處嫁审。
2、統(tǒng)一認(rèn)證中心方案原理
在生活中我們也有類(lèi)似的相關(guān)生活經(jīng)驗(yàn)赖晶,例如你去食堂吃飯律适,食堂打飯的阿姨(www.qiandu.com)告訴你,不收現(xiàn)金遏插。并且告訴你捂贿,你去門(mén)口找換票的(passport.com)換小票。于是你換完票之后胳嘲,再去找食堂阿姨厂僧,食堂阿姨拿著你的票,問(wèn)門(mén)口換票的了牛,這個(gè)票是真的嗎颜屠?換票的說(shuō),是真的鹰祸,于是給你打飯了甫窟。
基于上述生活中的場(chǎng)景,我們將基于Cookie的單點(diǎn)登錄改良以后的方案如下:
經(jīng)過(guò)分析蛙婴,Cookie單點(diǎn)登錄認(rèn)證太過(guò)于分散粗井,每個(gè)網(wǎng)站都持有一份登陸認(rèn)證代碼。于是我們將認(rèn)證統(tǒng)一化,形成一個(gè)獨(dú)立的服務(wù)浇衬。當(dāng)我們需要登錄操作時(shí)懒构,則重定向到統(tǒng)一認(rèn)證中心http://passport.com。于是乎整個(gè)流程就如上圖所示:
第一步:用戶訪問(wèn)www.qiandu.com径玖。過(guò)濾器判斷用戶是否登錄痴脾,沒(méi)有登錄,則重定向(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)行正常的訪問(wè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铝条。用來(lái)提供認(rèn)證服務(wù),由CAS框架提供席噩,用戶只需要根據(jù)業(yè)務(wù)實(shí)現(xiàn)認(rèn)證的邏輯即可班缰。
用戶web項(xiàng)目:只需要在web.xml中配置幾個(gè)過(guò)濾器,用來(lái)保護(hù)資源悼枢,過(guò)濾器也是CAS框架提供了埠忘,即cas-client,基本不需要改動(dòng)可以直接使用馒索。
4给梅、CAS的詳細(xì)登錄流程
上圖是3個(gè)登錄場(chǎng)景,分別為:第一次訪問(wèn)www.qiandu.com双揪、第二次訪問(wèn)动羽、以及登錄狀態(tài)下第一次訪問(wèn)mail.qiandu.com。
下面就詳細(xì)說(shuō)明上圖中每個(gè)數(shù)字標(biāo)號(hào)做了什么渔期,以及相關(guān)的請(qǐng)求內(nèi)容运吓,響應(yīng)內(nèi)容渴邦。
4.1、第一次訪問(wèn)www.qiandu.com
標(biāo)號(hào)1:用戶訪問(wèn)http://www.qiandu.com拘哨,經(jīng)過(guò)他的第一個(gè)過(guò)濾器(cas提供谋梭,在web.xml中配置)AuthenticationFilter。
過(guò)濾器全稱(chēng):org.jasig.cas.client.authentication.AuthenticationFilter
主要作用:判斷是否登錄倦青,如果沒(méi)有登錄則重定向到認(rèn)證中心瓮床。
標(biāo)號(hào)2:www.qiandu.com發(fā)現(xiàn)用戶沒(méi)有登錄,則返回瀏覽器重定向地址产镐。
首先可以看到我們請(qǐng)求www.qiandu.com隘庄,之后瀏覽器返回狀態(tài)碼302,然后讓瀏覽器重定向到cas.qiandu.com并且通過(guò)get的方式添加參數(shù)service癣亚,該參數(shù)目的是登錄成功之后會(huì)要重定向回來(lái)丑掺,因此需要該參數(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)求唆缴,返回登陸頁(yè)面。
上圖就是標(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)證中心就展示登錄的頁(yè)面玩敏,等待用戶輸入用戶名密碼。
標(biāo)號(hào)5:用戶在cas.qiandu.com的login頁(yè)面輸入用戶名密碼质礼,提交旺聚。
標(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)證通過(guò)之后,會(huì)返回給瀏覽器302饭入,重定向的地址就是Referer中的service參數(shù)對(duì)應(yīng)的值嵌器。后邊并通過(guò)get的方式挾帶了一個(gè)ticket令牌,這個(gè)ticket就是ST(數(shù)字3處)谐丢。同時(shí)會(huì)在Cookie中設(shè)置一個(gè)CASTGC爽航,該cookie是網(wǎng)站cas.qiandu.com的cookie蚓让,只有訪問(wèn)這個(gè)網(wǎng)站才會(huì)攜帶這個(gè)cookie過(guò)去。
Cookie中的CASTGC:向cookie中添加該值的目的是當(dāng)下次訪問(wèn)cas.qiandu.com時(shí)讥珍,瀏覽器將Cookie中的TGC攜帶到服務(wù)器历极,服務(wù)器根據(jù)這個(gè)TGC,查找與之對(duì)應(yīng)的TGT衷佃。從而判斷用戶是否登錄過(guò)了趟卸,是否需要展示登錄頁(yè)面。TGT與TGC的關(guān)系就像SESSION與Cookie中SESSIONID的關(guān)系氏义。
TGT:Ticket Granted Ticket(俗稱(chēng)大令牌锄列,或者說(shuō)票根,他可以簽發(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在過(guò)濾器中會(huì)取到ticket的值规惰,然后通過(guò)http方式調(diào)用cas.qiandu.com驗(yàn)證該ticket是否是有效的。
標(biāo)號(hào)9:cas.qiandu.com接收到ticket之后泉蝌,驗(yàn)證歇万,驗(yàn)證通過(guò)返回結(jié)果告訴www.qiandu.com該ticket有效罕伯。
標(biāo)號(hào)10:www.qiandu.com接收到cas-server的返回婶芭,知道了用戶合法,展示相關(guān)資源到用戶瀏覽器上辉川。
至此诅愚,第一次訪問(wèn)的整個(gè)流程結(jié)束寒锚,其中標(biāo)號(hào)8與標(biāo)號(hào)9的環(huán)節(jié)是通過(guò)代碼調(diào)用的,并不是瀏覽器發(fā)起违孝,所以沒(méi)有截取到報(bào)文刹前。
4.2、第二次訪問(wèn)www.qiandu.com
上面以及訪問(wèn)過(guò)一次了雌桑,當(dāng)?shù)诙卧L問(wèn)的時(shí)候發(fā)生了什么呢喇喉?
標(biāo)號(hào)11:用戶發(fā)起請(qǐng)求,訪問(wèn)www.qiandu.com校坑。會(huì)經(jīng)過(guò)cas-client轧飞,也就是過(guò)濾器衅鹿,因?yàn)榈谝淮卧L問(wèn)成功之后www.qiandu.com中會(huì)在session中記錄用戶信息,因此這里直接就通過(guò)了过咬,不用驗(yàn)證了大渤。
標(biāo)號(hào)12:用戶通過(guò)權(quán)限驗(yàn)證,瀏覽器返回正常資源掸绞。
標(biāo)號(hào)13:用戶在www.qiandu.com正常上網(wǎng),突然想訪問(wèn)mail.qiandu.com衔掸,于是發(fā)起訪問(wèn)mail.qiandu.com的請(qǐng)求烫幕。
標(biāo)號(hào)14:mail.qiandu.com接收到請(qǐng)求,發(fā)現(xiàn)第一次訪問(wèn)敞映,于是給他一個(gè)重定向的地址较曼,讓他去找認(rèn)證中心登錄。
上圖可以看到振愿,用戶請(qǐng)求mail.qiandu.com捷犹,然后返回給他一個(gè)網(wǎng)址,狀態(tài)302重定向冕末,service參數(shù)就是回來(lái)的地址萍歉。
標(biāo)號(hào)15:瀏覽器根據(jù)14返回的地址,發(fā)起重定向档桃,因?yàn)橹霸L問(wèn)過(guò)一次了枪孩,因此這次會(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)證成功之后就反正用想要訪問(wèn)的資源了毁兆。