外行人都能看懂的單點登陸,不看血虧!!!

什麼是單點登陸

單點登陸的英文名 Single Sign On (SSO)。SSO的定義是在多個應用系統中,用戶只須要登陸一次就能夠訪問全部相互信任的應用系統。好比說淘寶和天貓都是阿里巴巴的子系統,在網頁端,咱們登陸了淘寶,那麼天貓也會自動登陸;反之相同。java

下面看一下單點登陸的大概的設計git

image

如上SSO的關鍵就是SSO認證中心,全部的子系統經過與SSO交互實現了一端登陸其餘端自動登陸。程序員

單系統登陸設計與實現

在瞭解多系統SSO設計與實現以前咱們先來看一下單系統登陸的設計與實現github

在初學servlet和jsp的時候,咱們實現的web項目的全部功能都部署在同一個tomcat服務器上面,經過http:localhost:8080/web/path進行訪問,這就是單系統。
imageweb

單系統登陸的實現

咱們知道HTTP協議是無狀態的,即每一次http請求都是獨立的,不會相互影響。對於同一客戶端發起的倆次請求,服務器端不會識別出來這倆個請求來自同一客戶端。而Cookie和Session就是解決Http無狀態的機制,Cookie存儲在客戶端,Session存儲在服務器端;服務器在請求的response中放入Cookie,瀏覽器收到Cookie後保存起來,而後下一次請求時攜帶上Cookie,在服務器端經過getCookie能夠得到cookie;而session在存儲在服務器端用於維護會話狀態的對象,session藉助於cookie實現,每個session經過一個JESSIONID值來標識,服務器經過set-cookie讓瀏覽器保存這個id,而後在請求中經過cookie中的id來getSession。數據庫

單系統登陸經過Cookie和Session就能夠實現。編程

image

多系統單點登陸的設計與實現

提到單系統SSO就不得不提CAS(Central Authentication Service),CAS是實現SSO的一個框架設計模式

CAS的倆個組成部分瀏覽器

  1. CAS Server : 單點驗證服務器,就是上面提到的SSO認證中心
  2. CAS Client :CAS Server服務的客戶端系統

CAS的三個重要術語tomcat

  1. TGT:Ticket Granting Ticket ,用戶登陸後生成的票根,包含用戶的認證身份,有效期等,存儲於CAS Server中,相似於服務器的session
  2. TGC:Ticket Granting Cookie ,存儲於cookie中,相似於SessionId。用戶與CAS Server交互時,幫助用戶查找相應的TGT
  3. ST:Sservice Ticket ,CAS Server 簽發的一次性票據,CAS Client 使用ST與CAS Server交互
CAS流程

假設咱們有倆個CAS Client系統webA(www.weba.sheledon.com)和webB(www.webb.sheledon.com)和一個CAS Server(www.sso.com)

image

首先有一個用戶來訪問咱們的webA系統,webA系統發現這個用戶沒有登陸,而後將用戶定向到sso認證中心(redirect: www.sso.com/login?service=weba)

sso認證中心發現用戶沒有SSO的session,因而向用戶返回wea的登陸頁面

image

用戶根據登陸頁面向sso認證中提交登陸表單

sso認證中心訪問數據庫驗證用戶信息,驗證完成後建立一個SSO的TGT,經過set-cookie將TGT的key值TGC存儲在客戶端,同時生成ticket,而且302重定向 redirect:www.weba.com?ticket=7980

用戶攜帶ticket訪問webA系統,webA系統再向SSO認證中心驗證ticket的真僞,驗證成功後,認證中心會響應一些必要屬性給webA系統

TGC驗證經過後webA系統和用戶創建局部會話,而且授予用戶權限,用戶能夠訪問webA系統的資源。

image

用戶成功登陸系統A後,而後訪問系統B(www.webb.com)

系統B發現用戶沒有登陸(用戶尚未與系統B創建局部對話),重定向到SSO Server

因爲用戶已經與CAS Server創建了全局對話,並且將TGC經過cookie保存在了客戶端,因此重定向攜帶TGC

CAS Server發現請求的cookie中有TGC,因此生成ticket,重定向www.webb.com?ticket=83745

系統B向SSO Server驗證ticket,驗證經過後,系統B與用戶創建局部對話,返回資源。

image

以上就是CAS大概的執行流程,其實看完這個流程你們徹底能夠本身實現一個SSO的demo

本身實現SSO的demo

其實看了上面的CAS流程咱們本身也很是容易實現一個小demo,我本身也實現了一個很是簡易的CAS,源代碼能夠訪問個人github倉庫:

https://github.com/Sheledons/SSODemo

實現也無非就是經過攔截器加一些條件判斷進行重定向或者資源的響應,可是在重定向的時候須要注意的就是針對瀏覽器的同源策略的解決,我使用的CORS。關於同源策略以及解決方案,能夠看一下下面的幾篇文章

https://juejin.im/post/6844903681683357710

https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS

重磅資源!!!

關注小白不想當碼農微信公衆號。

後臺回覆java核心技術卷關鍵字領取《java核心技術卷》pdf

回覆jvm領取《深刻理解Java虛擬機》pdf和《本身動手寫jvm

回覆設計模式領取《headfirst設計模式》pdf

回覆計算機網絡領取《計算機網絡自頂向下》pdf

最後

我是不想當碼農的小白,平時會寫寫一些技術博客,推薦優秀的程序員博主給你們還有本身遇到的優秀的java學習資源,但願和你們一塊兒進步,共同成長。

以上內容若有錯誤,還望指出,感謝

公衆號點擊交流,添加個人微信,一塊兒交流編程唄!

公衆號: 小白不想當碼農

image

相關文章
相關標籤/搜索