一、學習大綱
1.回顧會話機制和登錄機制. 因爲學習單點登錄需要對Cookie和Session有較深的理解,所以我們會先回顧知識.
2.多系統的複雜性帶來的問題,我們如何解決這些問題?通過這個問題引出單點登錄的需求.
3.自己動手寫單點登錄的服務端和客戶端,通過這個案例加深對單點登錄的理解.
4.學習使用開源的單點登錄框架CAS,我們使用cas-overlay-template模板來搭建CAS 服務端
5.搭建CAS的客戶端.我們需要學習普通項目集成CAS客戶端以及SpringBoot項目集成CAS客戶端.
目錄章節:
- SSO單點登錄教程(一)多系統的複雜性
- SSO單點登錄教程(二)單點登錄流程分析
- SSO單點登錄教程(三)單點註銷流程分析
- SSO單點登錄教程(四)自己動手寫SSO單點登錄服務端和客戶端
- SSO單點登錄教程(五)自己動手寫SSO單點註銷服務端和客戶端
- SSO單點登錄教程(六)CAS-簡介&配置https
- SSO單點登錄教程(七)CAS-搭建CAS Server服務端(靜態認證)
- SSO單點登錄教程(八)CAS-搭建CAS Server服務端(JDBC認證)
- SSO單點登錄教程(九)CAS-搭建CAS Client客戶端
- SSO單點登錄教程(十)CAS-自定義CAS Server端登錄頁面
二、回顧會話機制
Web環境中的會話指一個瀏覽器與交互系統進行通信的時間間隔,通常指從註冊進入系統到註銷退出系統之間所經過的時間,瀏覽器和服務器之間的會話是通過本地的cookie來實現的,通過下圖加深理解:
1.瀏覽器在第一次訪問Tomcat服務器的時候,Tomcat服務器會在服務端創建session對象,並存儲到map中.key是session的id,value是session對象本身.
2.在響應的時候會把session的id通過cookie的方式寫到客戶端瀏覽器中.
3.瀏覽器會在本地的目錄中把session的id寫入到本地的cookie中.
4.在後續的請求中,都會讀取本地的cookie中的內容,並在請求的時候帶上對應的cookie.
服務端的session和客戶端的cookie如何存儲的,請看下面這張圖:
三、回顧登陸機制
有了會話機制,登錄狀態就好明白了,我們假設瀏覽器第一次請求服務器需要輸入用戶名與密碼驗證身份,服務器拿到用戶名密碼去數據庫比對,正確的話說明當前持有這個會話的用戶是合法用戶,應該將這個會話標記爲“已授權”或者“已登錄”等等之類的狀態,既然是會話的狀態,自然要保存在會話對象中,Tomcat在會話對象中設置登錄狀態如下:
HttpSession session = request.getSession();
session.setAttribute("isLogin", true);
用戶再次訪問時,tomcat在會話對象中查看登錄狀態:
HttpSession session = request.getSession();
session.getAttribute("isLogin");
實現了登錄狀態的瀏覽器請求服務器模型如下圖描述:
每次請求受保護資源時都會檢查會話對象中的登錄狀態,只有 isLogin=true 的會話才能訪問,登錄機制因此而實現。
四、多系統的複雜性
隨着公司的發展,公司內部使用的系統越來越多.對於公司來說是件好事情,起碼證明公司在蓬勃發展,但是對於使用系統的員工來說不是個好事情.
1.每個系統都需要記住對應的賬號和密碼,如果有十個系統,意味員工需要記憶十套的賬號密碼,要記憶這些太痛苦了.所以很多員工的會把每個系統的賬號密碼都設置成一樣的.
2.如果同時要使用CRM系統,WMS系統,OA系統,用戶需要登錄三次.
3.如果不使用了,還需要分別在三個系統中依次的註銷.
有沒有這樣的功能:我只需要登錄一次,公司裏面所有的系統都可以使用.只需要註銷一次,所有的系統都退出登錄了.如果能實現這樣的功能就非常好了.我們理想的模型如下圖:
雖然單系統的登錄解決方案很完美,但對於多系統應用羣已經不再適用了,爲什麼呢?
單系統登錄解決方案的核心是cookie,cookie攜帶會話id在瀏覽器與服務器之間維護會話狀態。但cookie是有限制的,這個限制就是cookie的域(通常對應網站的域名),瀏覽器發送http請求時會自動攜帶與該域匹配的cookie,而不是所有cookie.
對應的cookie和session存儲如下圖:
既然這樣,爲什麼不將web應用羣中所有子系統的域名統一在一個頂級域名下,例如“*.baidu.com”,然後將它們的cookie域設置爲“baidu.com”,這種做法理論上是可以的,甚至早期很多多系統登錄就採用這種同域名共享cookie的方式。
然而,可行並不代表好,共享cookie的方式存在衆多侷限。首先,應用羣域名得統一;其次,應用羣各系統使用的技術(至少是web服務器)要相同,不然cookie的key值(tomcat爲JSESSIONID)不同,無法維持會話,共享cookie的方式是無法實現跨語言技術平臺登錄的,比如java、php、.net系統之間;第三,cookie本身不安全。
因此,我們需要一種全新的登錄方式來實現多系統應用羣的登錄,這就是單點登錄。
原文:https://www.jianshu.com/p/9dc05d51879f