單點登錄(SSO)看這一篇就夠了

背景

在企業(yè)發(fā)展初期,企業(yè)使用的系統(tǒng)很少壕翩,通常一個或者兩個蛉迹,每個系統(tǒng)都有自己的登錄模塊,運營人員每天用自己的賬號登錄放妈,很方便北救。

但隨著企業(yè)的發(fā)展,用到的系統(tǒng)隨之增多芜抒,運營人員在操作不同的系統(tǒng)時珍策,需要多次登錄,而且每個系統(tǒng)的賬號都不一樣宅倒,這對于運營人員

來說攘宙,很不方便。于是,就想到是不是可以在一個系統(tǒng)登錄蹭劈,其他系統(tǒng)就不用登錄了呢疗绣?這就是單點登錄要解決的問題。

單點登錄英文全稱Single Sign On铺韧,簡稱就是SSO多矮。它的解釋是:在多個應用系統(tǒng)中,只需要登錄一次哈打,就可以訪問其他相互信任的應用系統(tǒng)塔逃。

image

如圖所示,圖中有4個系統(tǒng)料仗,分別是Application1患雏、Application2、Application3罢维、和SSO淹仑。Application1、Application2肺孵、Application3沒有登錄模塊匀借,而SSO只有登錄模塊,沒有其他的業(yè)務模塊平窘,當Application1吓肋、Application2、Application3需要登錄時瑰艘,將跳到SSO系統(tǒng)是鬼,SSO系統(tǒng)完成登錄,其他的應用系統(tǒng)也就隨之登錄了紫新。這完全符合我們對單點登錄(SSO)的定義均蜜。

技術(shù)實現(xiàn)

在說單點登錄(SSO)的技術(shù)實現(xiàn)之前,我們先說一說普通的登錄認證機制芒率。

image

如上圖所示囤耳,我們在瀏覽器(Browser)中訪問一個應用,這個應用需要登錄偶芍,我們填寫完用戶名和密碼后充择,完成登錄認證。這時匪蟀,我們在這個用戶的session中標記登錄狀態(tài)為yes(已登錄)椎麦,同時在瀏覽器(Browser)中寫入Cookie,這個Cookie是這個用戶的唯一標識材彪。下次我們再訪問這個應用的時候观挎,請求中會帶上這個Cookie撒桨,服務端會根據(jù)這個Cookie找到對應的session,通過session來判斷這個用戶是否登錄键兜。如果不做特殊配置凤类,這個Cookie的名字叫做jsessionid,值在服務端(server)是唯一的普气。

同域下的單點登錄

一個企業(yè)一般情況下只有一個域名谜疤,通過二級域名區(qū)分不同的系統(tǒng)。比如我們有個域名叫做:a.com现诀,同時有兩個業(yè)務系統(tǒng)分別為:app1.a.com和app2.a.com夷磕。我們要做單點登錄(SSO),需要一個登錄系統(tǒng)仔沿,叫做:sso.a.com坐桩。

我們只要在sso.a.com登錄,app1.a.com和app2.a.com就也登錄了封锉。通過上面的登陸認證機制绵跷,我們可以知道,在sso.a.com中登錄了成福,其實是在sso.a.com的服務端的session中記錄了登錄狀態(tài)碾局,同時在瀏覽器端(Browser)的sso.a.com下寫入了Cookie。那么我們怎么才能讓app1.a.com和app2.a.com登錄呢奴艾?這里有兩個問題:

  • Cookie是不能跨域的净当,我們Cookie的domain屬性是sso.a.com,在給app1.a.com和app2.a.com發(fā)送請求是帶不上的蕴潦。
  • sso像啼、app1和app2是不同的應用,它們的session存在自己的應用內(nèi)潭苞,是不共享的忽冻。
image

那么我們?nèi)绾谓鉀Q這兩個問題呢?針對第一個問題萄传,sso登錄以后甚颂,可以將Cookie的域設置為頂域蜜猾,即.a.com秀菱,這樣所有子域的系統(tǒng)都可以訪問到頂域的Cookie。我們在設置Cookie時蹭睡,只能設置頂域和自己的域衍菱,不能設置其他的域。比如:我們不能在自己的系統(tǒng)中給baidu.com的域設置Cookie肩豁。

Cookie的問題解決了脊串,我們再來看看session的問題辫呻。我們在sso系統(tǒng)登錄了,這時再訪問app1琼锋,Cookie也帶到了app1的服務端(Server)放闺,app1的服務端怎么找到這個Cookie對應的Session呢?這里就要把3個系統(tǒng)的Session共享缕坎,如圖所示怖侦。共享Session的解決方案有很多,例如:Spring-Session谜叹。這樣第2個問題也解決了匾寝。

同域下的單點登錄就實現(xiàn)了,但這還不是真正的單點登錄荷腊。

不同域下的單點登錄

同域下的單點登錄是巧用了Cookie頂域的特性艳悔。如果是不同域呢?不同域之間Cookie是不共享的女仰,怎么辦猜年?

這里我們就要說一說CAS流程了,這個流程是單點登錄的標準流程疾忍。

cas_flow_diagram

上圖是CAS官網(wǎng)上的標準流程码倦,具體流程如下:

  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)進行認證后诊胞,將登錄狀態(tài)寫入SSO的session暖夭,瀏覽器(Browser)中寫入SSO域下的Cookie。
  4. SSO系統(tǒng)登錄完成后會生成一個ST(Service Ticket)撵孤,然后跳轉(zhuǎn)到app系統(tǒng)迈着,同時將ST作為參數(shù)傳遞給app系統(tǒng)。
  5. app系統(tǒng)拿到ST后邪码,從后臺向SSO發(fā)送請求裕菠,驗證ST是否有效。
  6. 驗證通過后闭专,app系統(tǒng)將登錄狀態(tài)寫入session并設置app域下的Cookie奴潘。

至此旧烧,跨域單點登錄就完成了。以后我們再訪問app系統(tǒng)時画髓,app就是登錄的掘剪。接下來,我們再看看訪問app2系統(tǒng)時的流程奈虾。

  1. 用戶訪問app2系統(tǒng)杖小,app2系統(tǒng)沒有登錄,跳轉(zhuǎn)到SSO愚墓。
  2. 由于SSO已經(jīng)登錄了予权,不需要重新登錄認證。
  3. SSO生成ST浪册,瀏覽器跳轉(zhuǎn)到app2系統(tǒng)扫腺,并將ST作為參數(shù)傳遞給app2。
  4. app2拿到ST笆环,后臺訪問SSO厚者,驗證ST是否有效躁劣。
  5. 驗證成功后,app2將登錄狀態(tài)寫入session库菲,并在app2域下寫入Cookie账忘。

這樣,app2系統(tǒng)不需要走登錄流程熙宇,就已經(jīng)是登錄了鳖擒。SSO,app和app2在不同的域烫止,它們之間的session不共享也是沒問題的蒋荚。

有的同學問我,SSO系統(tǒng)登錄后馆蠕,跳回原業(yè)務系統(tǒng)時期升,帶了個參數(shù)ST,業(yè)務系統(tǒng)還要拿ST再次訪問SSO進行驗證互躬,覺得這個步驟有點多余播赁。他想SSO登錄認證通過后,通過回調(diào)地址將用戶信息返回給原業(yè)務系統(tǒng)吨铸,原業(yè)務系統(tǒng)直接設置登錄狀態(tài)行拢,這樣流程簡單,也完成了登錄诞吱,不是很好嗎舟奠?

其實這樣問題時很嚴重的,如果我在SSO沒有登錄房维,而是直接在瀏覽器中敲入回調(diào)的地址沼瘫,并帶上偽造的用戶信息,是不是業(yè)務系統(tǒng)也認為登錄了呢咙俩?這是很可怕的耿戚。

總結(jié)

單點登錄(SSO)的所有流程都介紹完了,原理大家都清楚了阿趁∧せ祝總結(jié)一下單點登錄要做的事情:

  • 單點登錄(SSO系統(tǒng))是保障各業(yè)務系統(tǒng)的用戶資源的安全 。
  • 各個業(yè)務系統(tǒng)獲得的信息是脖阵,這個用戶能不能訪問我的資源皂股。
  • 單點登錄,資源都在各個業(yè)務系統(tǒng)這邊命黔,不在SSO那一方呜呐。 用戶在給SSO服務器提供了用戶名密碼后,作為業(yè)務系統(tǒng)并不知道這件事悍募。 SSO隨便給業(yè)務系統(tǒng)一個ST蘑辑,那么業(yè)務系統(tǒng)是不能確定這個ST是用戶偽造的,還是真的有效坠宴,所以要拿著這個ST去SSO服務器再問一下洋魂,這個用戶給我的ST是否有效,是有效的我才能讓這個用戶訪問喜鼓。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末忧设,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子颠通,更是在濱河造成了極大的恐慌址晕,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顿锰,死亡現(xiàn)場離奇詭異谨垃,居然都是意外死亡,警方通過查閱死者的電腦和手機硼控,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門刘陶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人牢撼,你說我怎么就攤上這事匙隔。” “怎么了熏版?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵纷责,是天一觀的道長捍掺。 經(jīng)常有香客問我,道長再膳,這世上最難降的妖魔是什么挺勿? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮喂柒,結(jié)果婚禮上不瓶,老公的妹妹穿的比我還像新娘。我一直安慰自己灾杰,他們只是感情好蚊丐,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著艳吠,像睡著了一般麦备。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讲竿,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天泥兰,我揣著相機與錄音,去河邊找鬼题禀。 笑死鞋诗,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的迈嘹。 我是一名探鬼主播削彬,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼秀仲!你這毒婦竟也來了融痛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤神僵,失蹤者是張志新(化名)和其女友劉穎雁刷,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體保礼,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡沛励,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了炮障。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片目派。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖胁赢,靈堂內(nèi)的尸體忽然破棺而出企蹭,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布谅摄,位于F島的核電站徒河,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏螟凭。R本人自食惡果不足惜虚青,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一它呀、第九天 我趴在偏房一處隱蔽的房頂上張望螺男。 院中可真熱鬧,春花似錦纵穿、人聲如沸下隧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽淆院。三九已至,卻和暖如春句惯,著一層夾襖步出監(jiān)牢的瞬間土辩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工抢野, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拷淘,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓指孤,卻偏偏與公主長得像启涯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子恃轩,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1. CAS 簡介 1.1. What is CAS 结洼? CAS ( Central Authenti...
    人在碼途閱讀 9,805評論 3 51
  • 主要介紹CAS SSO的認證流程。有關(guān)這方面的內(nèi)容再網(wǎng)上也有很多資料叉跛,寫這篇總結(jié)目的一來是自己在理解這塊內(nèi)容的時候...
    spilledyear閱讀 9,804評論 1 17
  • 單點登錄(SSO——Single Sign On)對于我們來說已經(jīng)不陌生了松忍。對于大型系統(tǒng)來說使用單點登錄可以減少用...
    像敏銳的狗閱讀 2,454評論 0 19
  • 單點登錄(SSO——Single Sign On)對于我們來說已經(jīng)不陌生了。對于大型系統(tǒng)來說使用單點登錄可以減少用...
    無灃閱讀 3,302評論 2 18
  • 陽臺上擱著幾盆多肉筷厘。 一盆的葉子如花瓣般美麗鸣峭,另一盆的葉子普普通通;一盆綠中帶點紅紅中還帶點黑敞掘,另...
    Roxanne_65閱讀 225評論 0 0