之前做了單點登錄系統(tǒng),然后也查閱了一些資料,參考著這些資料加上自己的理解,本文就聊一聊單點登錄系統(tǒng)以及實現(xiàn)原理,但并不涉及代碼部分,希望此文能對你有所幫助。

首先要說明的是,單點登錄并不是說像咱們登錄 QQ 一樣,只能在一個設(shè)備登錄,這不叫單點登錄。如果有人這么對你解釋,要記得保持微笑。
1、為什么需要單點登錄系統(tǒng)
單點登錄在大型網(wǎng)站里使用得非常頻繁,例如像天貓這樣的網(wǎng)站,在網(wǎng)站的背后是成百上千的子系統(tǒng),不信往下看。
進去天貓之后,地址欄是這樣的:

然后你想看看男裝,地址欄又變成這樣的了:

然后突然又想看看女鞋,地址欄又變了:

你看,就點了這幾下就涉及到三個子系統(tǒng),所以說像天貓這種大型商城涉及到非常多的子系統(tǒng)。
用戶一次操作或交易可能涉及到幾十個子系統(tǒng)的協(xié)作,如果每個子系統(tǒng)都需要用戶認證,讓用戶輸入用戶名密碼,不僅用戶會瘋掉,各子系統(tǒng)也會為這種重復認證授權(quán)的邏輯搞瘋掉。
2、單點登錄系統(tǒng)簡介
單點登錄系統(tǒng)又稱 Single Sign On(以下簡稱 SSO),所謂單點登錄就是說,在相互信任的應用中,只需登陸一次即可相互訪問,也就是用戶的一次登錄能得到其他所有系統(tǒng)的信任。
舉個栗子:
你周末和小伙伴喜滋滋的去了游樂場玩耍,進游樂場之后想玩云霄飛車,然后工作人員對你們一通檢查,你覺得正常,檢查就檢查唄。
然后又去玩摩天輪,工作人員又是對你們一通檢查,耽誤時間不說,而且已經(jīng)檢查過了,再檢查也沒意義了,好吧,為了玩耍你忍了。
你又想去玩過山車了,工作人員又把你攔住了,要檢查,統(tǒng)統(tǒng)檢查,這時候你可能就不能忍了。
那么這個時候如果第一次檢查之后給你發(fā)個令牌,以后想玩所有的項目都不需要檢查了,想玩什么玩什么,多好。
這就是所謂的單點登錄,只需一次登錄就行了。
對于我們得項目來說,無論 web 系統(tǒng)內(nèi)部多么復雜,對用戶而言,都是一個統(tǒng)一的整體,也就是說,用戶訪問 web 系統(tǒng)的整個應用群與訪問單個系統(tǒng)一樣,登錄/注銷只要一次就夠了。
3、單點登錄系統(tǒng)原理
sso 需要一個獨立的認證中心,只有認證中心能接受用戶的用戶名密碼等安全信息,其他系統(tǒng)不提供登錄入口,只接受認證中心的間接授權(quán)。間接授權(quán)通過令牌實現(xiàn),sso認證中心驗證用戶的用戶名密碼沒問題,創(chuàng)建授權(quán)令牌,在接下來的跳轉(zhuǎn)過程中,授權(quán)令牌作為參數(shù)發(fā)送給各個子系統(tǒng),子系統(tǒng)拿到令牌,即得到了授權(quán),可以借此創(chuàng)建局部會話,局部會話登錄方式與單系統(tǒng)的登錄方式相同。
用戶登錄成功之后,會與 sso 認證中心及各個子系統(tǒng)建立會話,用戶與
sso 認證中心建立的會話稱為全局會話,用戶與各個子系統(tǒng)建立的會話稱為局部會話。
單點登錄的原理如下圖所述:

對上圖簡要說明:
- 用戶訪問系統(tǒng)1,系統(tǒng) 1 發(fā)現(xiàn)用戶未登錄,跳轉(zhuǎn)至 sso 認證中心,并將自己的地址作為參數(shù);
- sso 認證中心發(fā)現(xiàn)用戶未登錄,將用戶引導至登錄頁面;
- 用戶輸入用戶名密碼提交登錄申請;
- sso 認證中心校驗用戶信息,創(chuàng)建用戶與 sso 認證中心之間的會話,稱為全局會話,同時創(chuàng)建授權(quán)令牌;
- sso 認證中心帶著令牌跳轉(zhuǎn)會最初的請求地址(系統(tǒng) 1);
- 系統(tǒng) 1 拿到令牌,去 sso 認證中心校驗令牌是否有效;
- sso 認證中心校驗令牌,返回有效,注冊系統(tǒng) 1;
- 系統(tǒng)1使用該令牌創(chuàng)建與用戶的會話,稱為局部會話,返回受保護資源
用戶訪問系統(tǒng) 2; - 系統(tǒng) 2 發(fā)現(xiàn)用戶未登錄,跳轉(zhuǎn)至 sso 認證中心,并將自己的地址作為參數(shù);
- sso 認證中心發(fā)現(xiàn)用戶已登錄,跳轉(zhuǎn)回系統(tǒng) 2 的地址,并附上令牌;
- 系統(tǒng) 2 拿到令牌,去 sso 認證中心校驗令牌是否有效;
- sso 認證中心校驗令牌,返回有效,注冊系統(tǒng) 2;
- 系統(tǒng) 2 使用該令牌創(chuàng)建與用戶的局部會話。
4、單點注銷
單點注銷就是說,在一個子系統(tǒng)中注銷,所有子系統(tǒng)的會話都將被銷毀,如下圖所示:

sso 認證中心一直監(jiān)聽全局會話的狀態(tài),一旦全局會話銷毀,監(jiān)聽器將通知所有注冊系統(tǒng)執(zhí)行注銷操作。
下面對上圖簡要說明:
- 用戶向系統(tǒng) 1 發(fā)起注銷請求;
- 系統(tǒng) 1 根據(jù)用戶與系統(tǒng) 1 建立的會話 id 拿到令牌,向 sso 認證中心發(fā)起注銷請求;
- sso 認證中心校驗令牌有效,銷毀全局會話,同時取出所有用此令牌注冊的系統(tǒng)地址;
- sso 認證中心向所有注冊系統(tǒng)發(fā)起注銷請求;
- 各注冊系統(tǒng)接收 sso 認證中心的注銷請求,銷毀局部會話;
- sso 認證中心引導用戶至登錄頁面。
希望你幫助到你,還請大家多多關(guān)注,謝謝嘍~