1.定義
????????英文名Single Sign On岸晦,簡稱SSO,簡單理解為:在多個應用系統(tǒng)中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統(tǒng)阀趴。
包含兩部分:
(1)單點登錄
(2)單點注銷
2.單系統(tǒng)登錄以及多系統(tǒng)登錄
(1)單系統(tǒng)登錄
? ? ? ? a.依賴機制(會話凶伙,原因是http協(xié)議是無狀態(tài)協(xié)議郭毕,并且會話可以使得瀏覽器和服務器維持一個狀態(tài))
????????現在web應用采用browser/server架構(B/S,瀏覽器/服務器)函荣,選用http作為通信協(xié)議显押。并且http是無狀態(tài)協(xié)議扳肛,對于瀏覽器的每一次請求,服務器都會單獨處理乘碑,不與前后的請求產生任何關聯(lián)挖息,如下圖1可明確關系:
????????通過上圖可以明確,每次請求是互不相關聯(lián)的兽肤,并且每個瀏覽器或者說每個用戶都是可以訪問服務器獲取信息的套腹,那么這時就會想到如何去保護服務器資源,只允許某些符合要求的請求去訪問服務器資源资铡,就需要限制瀏覽器請求电禀,由于http協(xié)議是無狀態(tài)的協(xié)議,無法通過該http請求來限制害驹,所以那么就需要在服務器和瀏覽器之前創(chuàng)建一個狀態(tài)鞭呕,去共同維護這個狀態(tài),這個就是會話機制宛官。
? ? ? ? 會話實現了每個后續(xù)請求與第一次請求的關聯(lián)葫松,當用戶通過瀏覽器第一次請求服務器,服務器就會創(chuàng)建一個會話底洗,并且服務器響應瀏覽器時腋么,會將會話的id作為響應的一部分發(fā)送給瀏覽器,瀏覽器會暫時存儲這個會話id亥揖,并且在后續(xù)的請求中都會帶上這個會話id珊擂,服務器再通過該會話id就可以去判定當前請求用戶與之前用戶是否相同了,如下圖2可清楚了解到會話在瀏覽器和服務器之前的關聯(lián):
? ? ? ? b.會話在服務器和瀏覽器中的保存形式
????????服務器在內存中保存會話對象(session)费变。
????????瀏覽器則是采用兩種方式保存會話id摧扇,如下:
? ? ? ? (a)url請求參數存儲
????????這種方式是在每一個請求的url的請求參數中添加上會話id,那么當瀏覽器發(fā)出請求后挚歧,服務器獲取到請求后就可以拿到會話id扛稽,并通過它來判斷是否同一個會話(用戶)。但滑负,通過這種方式來判斷是否為同一會話(用戶)比較麻煩在张。
? ? ? ? (b)cookie存儲
? ? ? ? cookie是瀏覽器用來存儲少量數據的一種機制,并且以“key/value”的數據格式存儲矮慕,使用瀏覽器的cookie機制可以很好的來維護會話id帮匾,cookie會在每一次http請求是自動被http請求附帶,那么服務器每一次接收請求時都可以獲取到http請求所附帶的cookie信息痴鳄,從而判斷請求的會話是否為與之前相同的會話瘟斜。????
????????對于服務器tomcat,tomcat的會話機制也實現了cookie,所以當tomcat中設置了會話之后哼转,tomcat響應瀏覽器之后明未,瀏覽器就會設置一個名為“JSESSIONID”的cookie槽华,這個就相當于tomcat會話機制中的會話id壹蔓,tomcat創(chuàng)建了會話響應以及瀏覽器帶cookie請求的流程圖如下圖3:
? ? ? ? 通過上圖可以確認,瀏覽器第一次請求之后猫态,tomcat服務器會創(chuàng)建會話佣蓉,并響應給瀏覽器,這時亲雪,瀏覽器會設置名為“JSESSIONID”的cookie勇凭,瀏覽器在后續(xù)的所有請求中,都會帶上這個cookie去請求tomcat服務器义辕,從而tomcat服務器可以確認前后會話的一致性虾标,從而達到我們想要的限制瀏覽器部分請求的目的。
? ? ? ? c.通過會話確認用戶在服務器的登錄狀態(tài)
? ? ? ? 登錄流程如下:
? ? ? ? (a)第一次請求灌砖,用戶在瀏覽器輸入賬戶和密碼璧函,瀏覽器將這些信息傳輸給tomcat服務器
? ? ? ? (b)tomcat服務器創(chuàng)建會話
? ? ? ? (c)驗證用戶名和密碼是否正確(正確)
? ? ? ? (d)設置登錄狀態(tài)isLogin()為true(并將登錄標識存入會話)
? ? ? ? (e)第一次響應(帶上tomcat的會話id:JSESSIONID)
? ? ? ? (f)瀏覽器設置名為JSESSIONID的cookie
? ? ? ? (g)第二次請求,帶上名為JSESSIONID的cookie請求服務器
? ? ? ? (h)在服務器端查看登錄狀態(tài)isLogin()
? ? ? ? (i)第二次響應(此時響應不帶會話id)
? ? ? ? ......
? ? ? ? 單系統(tǒng)登錄流程圖如下圖4所示:
? ? ? ? (2)多系統(tǒng)登錄
? ? ? ? 上面以及介紹單系統(tǒng)是如何登錄的基显,但是如果多系統(tǒng)都使用單系統(tǒng)的登錄方式蘸吓,就會發(fā)現,多系統(tǒng)中的每個系統(tǒng)都需要登錄一次撩幽,這樣不僅繁瑣库继,用戶操作起來實用性也是很低,這樣就達不到我們想要得到的效果:登錄一次無需再次登錄窜醉。如圖5宪萄,用戶登錄多系統(tǒng)。
????????這里相當于提高了用戶的操作負擔榨惰,那么我們就應該思考了拜英,如何使得用戶只需要登錄一次就可以進入所有系統(tǒng),也就是說相當于把多系統(tǒng)看成一個系統(tǒng)(系統(tǒng)群)读串,在任意一個子系統(tǒng)登錄都可以進入其余的任意系統(tǒng)(注銷同理)聊记,也就是達到如下圖6所示的效果。
? ? ? ? 上面提到cookie可以解決單系統(tǒng)登錄恢暖,cookie會攜帶會話的id在瀏覽器和服務器之間維護會話狀態(tài)排监,那么為什么cookie不能解決多系統(tǒng)的登錄呢,原因其實就是cookie的域(常指每個系統(tǒng)網站的對應域名)杰捂,對于瀏覽器在發(fā)送http請求時舆床,它會自動攜帶與該域匹配的cookie,但不是所有cookie,這樣每個域下面的cookie不同挨队,那么就無法維護系統(tǒng)與系統(tǒng)之間的會話狀態(tài)谷暮,如下圖7。
? ? ? ? 這時就發(fā)現盛垦,跨域后cookie無法處理多系統(tǒng)之間(一個應用群)的登錄問題湿弦,那么將所有系統(tǒng)分配在同一個域名下面,再使用cookie就可以維護它們之間的會話狀態(tài)腾夯,就能達到我們的預期目標了颊埃,但其實這種同域方式雖可以解決上面說的多系統(tǒng)登錄問題,但是它存在比較多的局限性蝶俱,實現之后的效果其實并不是最理想的班利,主要有以下幾個原因(缺點):
????????a.所有系統(tǒng)的域名必須統(tǒng)一,增加這之間的處理時間以及配置過程
? ? ? ? b.應用群中的各個系統(tǒng)使用的技術(至少是web服務器榨呆,比如Java罗标、.net、php等)必須相同积蜻,否則cookie的key值(tomcat為JSESSIONID)就不相同闯割,無法在各個系統(tǒng)之間維護會話狀態(tài),因為共享cookie的方式是無法實現跨語言技術平臺登錄的浅侨,這極大的限制了開發(fā)的多樣性纽谒,以及極大的限制了開發(fā)各個系統(tǒng)的開發(fā)人員必須都使用相同語言,一旦某個系統(tǒng)使用一種語言如输,其他系統(tǒng)必須使用相同語言鼓黔,不懂此門語言的開發(fā)人員將無法介入其中,增加成本不见。
????????c.cookie本身不安全澳化,因為cookie存在瀏覽器(客戶端),一些別有用心的人拿到cookie(就算加密)之后稳吮,不需要知道指定的cookie的具體含義缎谷,只需要拿到這個cookie向服務器提交,就能夠冒充受害人身份登錄網站(cookie欺騙)灶似,這樣會對個人信息造成嚴重危害(可深入了解cookie安全性問題)列林。
? ? ? ? 上面說了那么多,那么哪種方式才是實現多系統(tǒng)之間的登錄的更優(yōu)方式酪惭,其實就是單點登錄希痴。
3.單點登錄的原理
? ? ? ? 文章開頭已經說明,單點登錄是指在多個應用系統(tǒng)中春感,用戶只需要登錄一次就可以訪問所有相互信任的應用系統(tǒng)砌创。
????????那么如何才能只登錄一次就可以訪問所有系統(tǒng)呢虏缸?有一個指定的唯一的統(tǒng)一處理驗證用戶信息的身份認證中心是關鍵。
????????具體介紹以及單點登錄流程如下嫩实。
? ? ? ? (1)單點登錄
? ? ? ? 相比較于單系統(tǒng)登錄而言刽辙,要想實現單點登錄,就需要一個獨立的身份認證中心甲献,只有認證中心能夠接受用戶名和密碼等安全信息宰缤,統(tǒng)一處理驗證用戶信息,是否登錄成功由驗證中心發(fā)出竟纳,其他系統(tǒng)不提供登錄入口撵溃,只接受認證中心的間接授權。
? ? ? ? 間接授權主要通過該令牌實現锥累,認證中心拿到用戶名和密碼之后,會驗證用戶名和密碼是否正確集歇,確認用戶名和密碼正確之后桶略,認證中心創(chuàng)建授權令牌,在之后的跳轉過程中诲宇,授權令牌作為參數發(fā)送給各個子系統(tǒng)际歼,子系統(tǒng)拿到了令牌,那么就相當于得到了授權姑蓝,對應子系統(tǒng)就可以創(chuàng)建局部會話鹅心,局部會話登錄方式與單系統(tǒng)登錄方式相同,就相當于實現了子系統(tǒng)的本地登錄纺荧,這時就可以訪問對應子系統(tǒng)的資源了旭愧。單點登錄原理圖如下圖8。
? ? ? ? 上圖的流程可分為如下:
? ? ? ? a.用戶訪問系統(tǒng)1的受保護資源時宙暇,系統(tǒng)1發(fā)現用戶未登錄(無本地局部會話)输枯,將自己的地址作為參數跳轉到sso身份認證中心確認當前用戶是否登錄
? ? ? ? b.sso身份認證中心接收到請求之后發(fā)現用戶未登錄,將用戶引導至登錄頁面(帶上系統(tǒng)1的地址)占贫,要求用戶登錄
? ? ? ? c.用戶輸入登錄的用戶名和密碼提交登錄申請(帶上系統(tǒng)1的地址)
? ? ? ? d.sso身份認證中心校驗提交上來的用戶信息桃熄,驗證成功后,創(chuàng)建用戶與sso身份認證中心之間的會話(全局會話)型奥,同時創(chuàng)建授權令牌
? ? ? ? e.sso身份認證中心帶著令牌跳轉回最初的系統(tǒng)1的請求地址
? ? ? ? f.系統(tǒng)1拿到令牌之后瞳收,去sso身份認證中心校驗令牌是否有效(帶上系統(tǒng)1的地址)
? ? ? ? g.sso身份認證中心校驗令牌是否有效,校驗成功厢汹,令牌有效螟深,注冊系統(tǒng)1,返回令牌有效
? ? ? ? h.系統(tǒng)1使用這個有效的令牌創(chuàng)建與用戶之間的會話(局部會話)坑匠,返回受保護資源
? ? ? ? 上面就是所有子系統(tǒng)均未在sso身份認證中心驗證過的初次訪問受保護資源的流程血崭,下面是sso身份認證中心已經認證了用戶時訪問另一系統(tǒng)的受保護資源的流程:
? ? ? ? i.用戶訪問系統(tǒng)2的受保護資源
? ? ? ? j.系統(tǒng)2發(fā)現用戶未登錄,參數中帶上自己的地址跳轉至sso身份認證中心去驗證當前用戶是否已認證
? ? ? ? k.sso身份認證中心發(fā)現用戶已經登錄,帶上令牌跳轉回系統(tǒng)2的地址
? ? ? ? l.系統(tǒng)2拿到令牌之后夹纫,去sso身份認證中心校驗令牌是否有效(帶上系統(tǒng)2的地址)
? ? ? ? m.sso身份認證中心校驗令牌是否有效咽瓷,校驗成功,令牌有效舰讹,注冊系統(tǒng)2茅姜,返回令牌有效
? ? ? ? n.系統(tǒng)2使用這個有效的令牌創(chuàng)建與用戶之間的會話(局部會話),返回受保護資源
? ? ? ? 在同一個sso身份認證中心中的系統(tǒng)都如上面所訴兩種流程進行單點登錄月匣。
? ? ? ? 用戶登錄成功之后钻洒,會與sso身份認證中心以及各個子系統(tǒng)創(chuàng)建會話,用戶與sso身份認證中心建立的會話稱為全局會話锄开,用戶與各個子系統(tǒng)建立的會話稱為局部會話素标,當局部會話建立之后,用戶訪問已建立局部會話的子系統(tǒng)的受保護資源時不再通過sso身份認證中心萍悴,全局會話與局部會話存在如下的約束關系:
? ? ? ? a.局部會話存在头遭,全局會話一定存在(因為局部會話創(chuàng)建的前提是,全部會話必須首先創(chuàng)建癣诱,也就是說先通過sso身份認證中心的驗證創(chuàng)建全局會話后才再指定系統(tǒng)創(chuàng)建局部會話)
? ? ? ? b.全局會話存在计维,局部會話不一定存在(同上說明,sso身份認證中心驗證通過后撕予,創(chuàng)建了全局會話鲫惶,但是沒有訪問其他系統(tǒng),其他系統(tǒng)的局部會話此時是不存在的)
? ? ? ? c.全局會話銷毀实抡,局部會話必須銷毀(這樣就可以實現所有子系統(tǒng)和sso身份認證中心會話狀態(tài)同步)
? ? ? ? (2)單點注銷
? ? ? ? 單點注銷也是單點登錄的一部分欠母,單點登錄是同時維持會話同步存在,單點注銷就是所有子系統(tǒng)的會話都銷毀澜术,實現在一個子系統(tǒng)注銷艺蝴,其他系統(tǒng)也同時注銷的效果(sso身份認證中心會一直監(jiān)聽全局會話的狀態(tài),一旦全局會話銷毀鸟废,監(jiān)聽器會通知所有注冊系統(tǒng)執(zhí)行注銷操作)猜敢,具體流程圖如下圖9。
? ? ? ? 具體流程說明如下:
? ? ? ? a.用戶在客戶端向系統(tǒng)1發(fā)起注銷請求
? ? ? ? b.系統(tǒng)1根據用戶與系統(tǒng)1建立的會話id獲取到令牌,向sso身份認證中心發(fā)起注銷請求
? ? ? ? c.sso身份認證中心校驗令牌有效性,銷毀全局會話曲饱,同時取出所有使用此令牌注冊的系統(tǒng)地址
? ? ? ? d.sso身份認證中心向所有注冊系統(tǒng)發(fā)起注銷請求
? ? ? ? e.各個注冊系統(tǒng)接收sso身份認證紅星的注銷請求,銷毀局部會話
? ? ? ? f.sso身份認證中心引導用戶跳轉至登錄頁面
注:部分圖片來自網絡