什么是單點(diǎn)登錄
單點(diǎn)登錄SSO(Single Sign On)說得簡(jiǎn)單點(diǎn)就是在一個(gè)多系統(tǒng)共存的環(huán)境下,用戶在一處登錄后,就不用在其他系統(tǒng)中登錄,也就是用戶的一次登錄能得到其他所有系統(tǒng)的信任。
單點(diǎn)登錄在大型網(wǎng)站里使用得非常頻繁,例如,阿里旗下有淘寶、天貓等網(wǎng)站,還有背后的成百上千的子系統(tǒng),用戶一次操作或交易可能涉及到幾十個(gè)子系統(tǒng)的協(xié)作,如果每個(gè)子系統(tǒng)都需要用戶認(rèn)證,不僅用戶會(huì)瘋掉,各子系統(tǒng)也會(huì)為這種重復(fù)認(rèn)證授權(quán)的邏輯搞瘋掉。
?
所以,單點(diǎn)登錄要解決的就是,用戶只需要登錄一次就可以訪問所有相互信任的應(yīng)用系統(tǒng)。
單點(diǎn)登錄的來源
1.早期web單系統(tǒng)應(yīng)用
早期我們開發(fā)web應(yīng)用都是所有的包放在一起打成一個(gè)war包放入tomcat容器來運(yùn)行的,所有的功能,所有的業(yè)務(wù),后臺(tái)管理,門戶界面,都是由這一個(gè)war來支持的,這樣的單應(yīng)用,也稱之為巨石應(yīng)用,因?yàn)槭植缓脭U(kuò)展和拆分。
在巨石應(yīng)用下,用戶的登錄以及權(quán)限就顯得十分簡(jiǎn)單,當(dāng)瀏覽器向服務(wù)器發(fā)送登錄請(qǐng)求時(shí),驗(yàn)證通過之后,會(huì)將用戶信息存入seesion
中,然后服務(wù)器會(huì)生成一個(gè)sessionId
放入cookie
中,隨后返回給瀏覽器。
大致可以用下圖來表示:
驗(yàn)證登錄的這個(gè)會(huì)話就是session,維護(hù)了用戶狀態(tài),也就是所謂的HTTP有狀態(tài)協(xié)議,我們經(jīng)??梢栽跒g覽器中看到JSESSIONID,這個(gè)就是用來維持這個(gè)關(guān)系的key。
2.分布式集群部署
由于網(wǎng)站的訪問量越來也大,單機(jī)部署已經(jīng)是巨大瓶頸,所以才有了后來的分布式集群部署。
例如:如果引入集群的概念,單應(yīng)用可能重新部署在3臺(tái)tomcat以上服務(wù)器,使用nginx來實(shí)現(xiàn)反向代理。
但是增加新的服務(wù)器之后,不同的服務(wù)器之間的sessionId是不一樣的,可能在A服務(wù)器上已經(jīng)登錄成功了,能從服務(wù)器的session中獲取用戶信息,但是在B服務(wù)器上卻查不到session信息,只好退出來繼續(xù)登錄,結(jié)果A服務(wù)器中的session因?yàn)槌瑫r(shí)失效,登錄之后又被強(qiáng)制退出來要求重新登錄。
所以不得不考慮多服務(wù)器之間的session數(shù)據(jù)一致的問題,這就是單點(diǎn)登錄的最早來源。
單點(diǎn)登錄的實(shí)現(xiàn)方式
單點(diǎn)登錄的本質(zhì)就是在多個(gè)應(yīng)用系統(tǒng)中共享登錄狀態(tài),如果用戶的登錄狀態(tài)是記錄在 Session 中的,要實(shí)現(xiàn)共享登錄狀態(tài),就要先共享 Session。
所以實(shí)現(xiàn)單點(diǎn)登錄的關(guān)鍵在于,如何讓 Session ID(或 Token)在多個(gè)域中共享。
1.同域下的單點(diǎn)登錄
一個(gè)企業(yè)一般情況下只有一個(gè)域名,通過二級(jí)域名區(qū)分不同的系統(tǒng)。
比如我有個(gè)域名:mikechen.cc,同時(shí)有兩個(gè)業(yè)務(wù)系統(tǒng)分別為:
我們要做單點(diǎn)登錄(SSO),需要一個(gè)登錄系統(tǒng),叫做:sso.mikechen.cc。
我們只要在sso.mikechen.cc登錄,blog.mikechen.cc和video.mikechen.cc也登錄了。
實(shí)現(xiàn)方式:其實(shí)這里就是利用了 二級(jí)域名 寫 一級(jí)域名的 Cookie 。
sso.mikechen.cc登錄以后,可以將Cookie的域設(shè)置為頂域,即.mikechen.cc,這樣所有子域blog.mikechen.cc和video.mikechen.cc的系統(tǒng)都可以訪問到頂域的Cookie。
此種實(shí)現(xiàn)方式比較簡(jiǎn)單,但不支持跨主域名,局限性限于一級(jí)域名是一樣的。
2.不同域下的單點(diǎn)登錄
同域下的單點(diǎn)登錄是巧用了Cookie頂域的特性,如果是不同域呢,比如:下面三個(gè)是不同域的
實(shí)現(xiàn)方式:我們可以部署一個(gè)SSO認(rèn)證中心,認(rèn)證中心就是一個(gè)專門負(fù)責(zé)處理登錄請(qǐng)求。
所有的請(qǐng)求(登錄、退出、獲取用戶信息、當(dāng)前用戶狀態(tài))都請(qǐng)求sso
系統(tǒng),sso
系統(tǒng)維護(hù)用戶信息。
此種實(shí)現(xiàn)方式相對(duì)復(fù)雜,支持跨域,擴(kuò)展性好。
基于SSO認(rèn)證中心的開源項(xiàng)目代表:CAS,其中 CAS是Central Authentication Service,即中央認(rèn)證服務(wù),下圖是CAS的基本過程: