背景在企業(yè)發(fā)展初期,企業(yè)使用的系統(tǒng)很少,通常一個(gè)或者兩個(gè),每個(gè)系統(tǒng)都有自己的登錄模塊,運(yùn)營(yíng)人員每天用自己的賬號(hào)登錄,很方便。 單點(diǎn)登錄英文全稱(chēng)Single Sign On,簡(jiǎn)稱(chēng)就是SSO。它的解釋是:在多個(gè)應(yīng)用系統(tǒng)中,只需要登錄一次,就可以訪問(wèn)其他相互信任的應(yīng)用系統(tǒng)。 如圖所示,圖中有4個(gè)系統(tǒng),分別是Application1、Application2、Application3、和SSO。Application1、Application2、Application3沒(méi)有登錄模塊,而SSO只有登錄模塊,沒(méi)有其他的業(yè)務(wù)模塊,當(dāng)Application1、Application2、Application3需要登錄時(shí),將跳到SSO系統(tǒng),SSO系統(tǒng)完成登錄,其他的應(yīng)用系統(tǒng)也就隨之登錄了。這完全符合我們對(duì)單點(diǎn)登錄(SSO)的定義。 技術(shù)實(shí)現(xiàn)在說(shuō)單點(diǎn)登錄(SSO)的技術(shù)實(shí)現(xiàn)之前,我們先說(shuō)一說(shuō)普通的登錄認(rèn)證機(jī)制。 如上圖所示,我們?cè)跒g覽器(Browser)中訪問(wèn)一個(gè)應(yīng)用,這個(gè)應(yīng)用需要登錄,我們填寫(xiě)完用戶(hù)名和密碼后,完成登錄認(rèn)證。這時(shí),我們?cè)谶@個(gè)用戶(hù)的session中標(biāo)記登錄狀態(tài)為yes(已登錄),同時(shí)在瀏覽器(Browser)中寫(xiě)入Cookie,這個(gè)Cookie是這個(gè)用戶(hù)的唯一標(biāo)識(shí)。下次我們?cè)僭L問(wèn)這個(gè)應(yīng)用的時(shí)候,請(qǐng)求中會(huì)帶上這個(gè)Cookie,服務(wù)端會(huì)根據(jù)這個(gè)Cookie找到對(duì)應(yīng)的session,通過(guò)session來(lái)判斷這個(gè)用戶(hù)是否登錄。如果不做特殊配置,這個(gè)Cookie的名字叫做jsessionid,值在服務(wù)端(server)是唯一的。 同域下的單點(diǎn)登錄一個(gè)企業(yè)一般情況下只有一個(gè)域名,通過(guò)二級(jí)域名區(qū)分不同的系統(tǒng)。比如我們有個(gè)域名叫做:a.com,同時(shí)有兩個(gè)業(yè)務(wù)系統(tǒng)分別為:app1.a.com和app2.a.com。我們要做單點(diǎn)登錄(SSO),需要一個(gè)登錄系統(tǒng),叫做:sso.a.com。 我們只要在sso.a.com登錄,app1.a.com和app2.a.com就也登錄了。通過(guò)上面的登陸認(rèn)證機(jī)制,我們可以知道,在sso.a.com中登錄了,其實(shí)是在sso.a.com的服務(wù)端的session中記錄了登錄狀態(tài),同時(shí)在瀏覽器端(Browser)的sso.a.com下寫(xiě)入了Cookie。那么我們?cè)趺床拍茏宎pp1.a.com和app2.a.com登錄呢?這里有兩個(gè)問(wèn)題:
那么我們?nèi)绾谓鉀Q這兩個(gè)問(wèn)題呢?針對(duì)第一個(gè)問(wèn)題,sso登錄以后,可以將Cookie的域設(shè)置為頂域,即.a.com,這樣所有子域的系統(tǒng)都可以訪問(wèn)到頂域的Cookie。我們?cè)谠O(shè)置Cookie時(shí),只能設(shè)置頂域和自己的域,不能設(shè)置其他的域。比如:我們不能在自己的系統(tǒng)中給baidu.com的域設(shè)置Cookie。 Cookie的問(wèn)題解決了,我們?cè)賮?lái)看看session的問(wèn)題。我們?cè)趕so系統(tǒng)登錄了,這時(shí)再訪問(wèn)app1,Cookie也帶到了app1的服務(wù)端(Server),app1的服務(wù)端怎么找到這個(gè)Cookie對(duì)應(yīng)的Session呢?這里就要把3個(gè)系統(tǒng)的Session共享,如圖所示。共享Session的解決方案有很多,例如:Spring-Session。這樣第2個(gè)問(wèn)題也解決了。 同域下的單點(diǎn)登錄就實(shí)現(xiàn)了,但這還不是真正的單點(diǎn)登錄。 不同域下的單點(diǎn)登錄同域下的單點(diǎn)登錄是巧用了Cookie頂域的特性。如果是不同域呢?不同域之間Cookie是不共享的,怎么辦? 這里我們就要說(shuō)一說(shuō)CAS流程了,這個(gè)流程是單點(diǎn)登錄的標(biāo)準(zhǔn)流程。 上圖是CAS官網(wǎng)上的標(biāo)準(zhǔn)流程,具體流程如下:
至此,跨域單點(diǎn)登錄就完成了。以后我們?cè)僭L問(wèn)app系統(tǒng)時(shí),app就是登錄的。接下來(lái),我們?cè)倏纯丛L問(wèn)app2系統(tǒng)時(shí)的流程。
這樣,app2系統(tǒng)不需要走登錄流程,就已經(jīng)是登錄了。SSO,app和app2在不同的域,它們之間的session不共享也是沒(méi)問(wèn)題的。 有的同學(xué)問(wèn)我,SSO系統(tǒng)登錄后,跳回原業(yè)務(wù)系統(tǒng)時(shí),帶了個(gè)參數(shù)ST,業(yè)務(wù)系統(tǒng)還要拿ST再次訪問(wèn)SSO進(jìn)行驗(yàn)證,覺(jué)得這個(gè)步驟有點(diǎn)多余。他想SSO登錄認(rèn)證通過(guò)后,通過(guò)回調(diào)地址將用戶(hù)信息返回給原業(yè)務(wù)系統(tǒng),原業(yè)務(wù)系統(tǒng)直接設(shè)置登錄狀態(tài),這樣流程簡(jiǎn)單,也完成了登錄,不是很好嗎? 其實(shí)這樣問(wèn)題時(shí)很?chē)?yán)重的,如果我在SSO沒(méi)有登錄,而是直接在瀏覽器中敲入回調(diào)的地址,并帶上偽造的用戶(hù)信息,是不是業(yè)務(wù)系統(tǒng)也認(rèn)為登錄了呢?這是很可怕的。 總結(jié)單點(diǎn)登錄(SSO)的所有流程都介紹完了,原理大家都清楚了??偨Y(jié)一下單點(diǎn)登錄要做的事情:
|
|