SSO:單點(diǎn)登錄(Single Sign On)
功能:在多個(gè)應(yīng)用系統(tǒng)中,只要登錄其中一個(gè),就可以訪問其他信任的系統(tǒng)。

<meta charset="utf-8">
如圖所示,圖中有4個(gè)系統(tǒng),分別是Application1、Application2、Application3、和SSO。Application1、Application2、Application3沒有登錄模塊,而SSO只有登錄模塊,沒有其他的業(yè)務(wù)模塊,當(dāng)Application1、Application2、Application3需要登錄時(shí),將跳到SSO系統(tǒng),SSO系統(tǒng)完成登錄,其他的應(yīng)用系統(tǒng)也就隨之登錄了。這完全符合我們對(duì)單點(diǎn)登錄(SSO)的定義。
同域下的SSO:
同域的條件:協(xié)議+域名+端口一致
1.sso登錄以后,可以將Cookie的域設(shè)置為頂域,即.a.com,這樣所有子域的系統(tǒng)都可以訪問到頂域的Cookie。我們?cè)谠O(shè)置Cookie時(shí),只能設(shè)置頂域和自己的域,不能設(shè)置其他的域。比如:我們不能在自己的系統(tǒng)中給baidu.com的域設(shè)置Cookie。
2.Cookie的問題解決了,我們?cè)賮砜纯磗ession的問題。我們?cè)趕so系統(tǒng)登錄了,這時(shí)再訪問app1,Cookie也帶到了app1的服務(wù)端(Server),app1的服務(wù)端怎么找到這個(gè)Cookie對(duì)應(yīng)的Session呢?這里就要把3個(gè)系統(tǒng)的Session共享,如圖所示。共享Session的解決方案有很多,例如:Spring-Session。這樣第2個(gè)問題也解決了。
同域下的單點(diǎn)登錄就實(shí)現(xiàn)了,但這還不是真正的單點(diǎn)登錄。
跨域SSO:
具體流程如下:
1.用戶訪問app系統(tǒng),app系統(tǒng)是需要登錄的,但用戶現(xiàn)在沒有登錄。
2.跳轉(zhuǎn)到CAS server,即SSO登錄系統(tǒng),以后圖中的CAS Server我們統(tǒng)一叫做SSO系統(tǒng)。 SSO系統(tǒng)也沒有登錄,彈出用戶登錄頁。
3.用戶填寫用戶名、密碼,SSO系統(tǒng)進(jìn)行認(rèn)證后,將登錄狀態(tài)寫入SSO的session,瀏覽器(Browser)中寫入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)證通過后,app系統(tǒng)將登錄狀態(tài)寫入session并設(shè)置app域下的Cookie。
至此,跨域單點(diǎn)登錄就完成了。以后我們?cè)僭L問app系統(tǒng)時(shí),app就是登錄的。接下來,我們?cè)倏纯丛L問app2系統(tǒng)時(shí)的流程。
1.用戶訪問app2系統(tǒng),app2系統(tǒng)沒有登錄,跳轉(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)訪問SSO,驗(yàn)證ST是否有效。
5.驗(yàn)證成功后,app2將登錄狀態(tài)寫入session,并在app2域下寫入Cookie。
這樣,app2系統(tǒng)不需要走登錄流程,就已經(jīng)是登錄了。SSO,app和app2在不同的域,它們之間的session不共享也是沒問題的。
CAS總結(jié)之Ticket篇https://blog.csdn.net/fireofjava/article/details/46944689