SSO單點登錄詳解-------一、多系統登錄時存在的問題

一、學習大綱

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如何存儲的,請看下面這張圖:

在這裏插入圖片描述

cookie和session的存儲

三、回顧登陸機制

有了會話機制,登錄狀態就好明白了,我們假設瀏覽器第一次請求服務器需要輸入用戶名與密碼驗證身份,服務器拿到用戶名密碼去數據庫比對,正確的話說明當前持有這個會話的用戶是合法用戶,應該將這個會話標記爲“已授權”或者“已登錄”等等之類的狀態,既然是會話的狀態,自然要保存在會話對象中,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

對應的cookie和session存儲如下圖:


多系統的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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章