日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

單點(diǎn)登錄(全)

 賀天天7tx7rrl1 2019-07-12

背景

在企業(yè)發(fā)展初期,企業(yè)使用的系統(tǒng)很少,通常一個(gè)或者兩個(gè),每個(gè)系統(tǒng)都有自己的登錄模塊,運(yùn)營(yíng)人員每天用自己的賬號(hào)登錄,很方便。
但隨著企業(yè)的發(fā)展,用到的系統(tǒng)隨之增多,運(yùn)營(yíng)人員在操作不同的系統(tǒng)時(shí),需要多次登錄,而且每個(gè)系統(tǒng)的賬號(hào)都不一樣,這對(duì)于運(yùn)營(yíng)人員
來(lái)說(shuō),很不方便。于是,就想到是不是可以在一個(gè)系統(tǒng)登錄,其他系統(tǒng)就不用登錄了呢?這就是單點(diǎn)登錄要解決的問(wèn)題。

單點(diǎn)登錄英文全稱(chēng)Single Sign On,簡(jiǎn)稱(chēng)就是SSO。它的解釋是:在多個(gè)應(yīng)用系統(tǒng)中,只需要登錄一次,就可以訪問(wèn)其他相互信任的應(yīng)用系統(tǒng)。

image

如圖所示,圖中有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ī)制。
image

如上圖所示,我們?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)題:

  • Cookie是不能跨域的,我們Cookie的domain屬性是sso.a.com,在給app1.a.com和app2.a.com發(fā)送請(qǐng)求是帶不上的。

  • sso、app1和app2是不同的應(yīng)用,它們的session存在自己的應(yīng)用內(nèi),是不共享的。

image

那么我們?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_flow_diagram

上圖是CAS官網(wǎng)上的標(biāo)準(zhǔn)流程,具體流程如下:

  1. 用戶(hù)訪問(wèn)app系統(tǒng),app系統(tǒng)是需要登錄的,但用戶(hù)現(xiàn)在沒(méi)有登錄。

  2. 跳轉(zhuǎn)到CAS server,即SSO登錄系統(tǒng),以后圖中的CAS Server我們統(tǒng)一叫做SSO系統(tǒng)。 SSO系統(tǒng)也沒(méi)有登錄,彈出用戶(hù)登錄頁(yè)。

  3. 用戶(hù)填寫(xiě)用戶(hù)名、密碼,SSO系統(tǒng)進(jìn)行認(rèn)證后,將登錄狀態(tài)寫(xiě)入SSO的session,瀏覽器(Browser)中寫(xiě)入SSO域下的Cookie。

  4. SSO系統(tǒng)登錄完成后會(huì)生成一個(gè)ST(Service Ticket),然后跳轉(zhuǎn)到app系統(tǒng),同時(shí)將ST作為參數(shù)傳遞給app系統(tǒng)。

  5. app系統(tǒng)拿到ST后,從后臺(tái)向SSO發(fā)送請(qǐng)求,驗(yàn)證ST是否有效。

  6. 驗(yàn)證通過(guò)后,app系統(tǒng)將登錄狀態(tài)寫(xiě)入session并設(shè)置app域下的Cookie。

至此,跨域單點(diǎn)登錄就完成了。以后我們?cè)僭L問(wèn)app系統(tǒng)時(shí),app就是登錄的。接下來(lái),我們?cè)倏纯丛L問(wèn)app2系統(tǒng)時(shí)的流程。

  1. 用戶(hù)訪問(wèn)app2系統(tǒng),app2系統(tǒng)沒(méi)有登錄,跳轉(zhuǎn)到SSO。

  2. 由于SSO已經(jīng)登錄了,不需要重新登錄認(rèn)證。

  3. SSO生成ST,瀏覽器跳轉(zhuǎn)到app2系統(tǒng),并將ST作為參數(shù)傳遞給app2。

  4. app2拿到ST,后臺(tái)訪問(wèn)SSO,驗(yàn)證ST是否有效。

  5. 驗(yàn)證成功后,app2將登錄狀態(tài)寫(xiě)入session,并在app2域下寫(xiě)入Cookie。

這樣,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)登錄要做的事情:

  • 單點(diǎn)登錄(SSO系統(tǒng))是保障各業(yè)務(wù)系統(tǒng)的用戶(hù)資源的安全 。

  • 各個(gè)業(yè)務(wù)系統(tǒng)獲得的信息是,這個(gè)用戶(hù)能不能訪問(wèn)我的資源。

  • 單點(diǎn)登錄,資源都在各個(gè)業(yè)務(wù)系統(tǒng)這邊,不在SSO那一方。 用戶(hù)在給SSO服務(wù)器提供了用戶(hù)名密碼后,作為業(yè)務(wù)系統(tǒng)并不知道這件事。 SSO隨便給業(yè)務(wù)系統(tǒng)一個(gè)ST,那么業(yè)務(wù)系統(tǒng)是不能確定這個(gè)ST是用戶(hù)偽造的,還是真的有效,所以要拿著這個(gè)ST去SSO服務(wù)器再問(wèn)一下,這個(gè)用戶(hù)給我的ST是否有效,是有效的我才能讓這個(gè)用戶(hù)訪問(wèn)。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多