1.回顧會話機制和登陸機制. 由於學習單點登陸須要對Cookie和Session有較深的理解,因此咱們會先回顧知識.
2.多系統的複雜性帶來的問題,咱們如何解決這些問題?經過這個問題引出單點登陸的需求.
3.本身動手寫單點登陸的服務端和客戶端,經過這個案例加深對單點登陸的理解.
4.學習使用開源的單點登陸框架CAS,咱們使用cas-overlay-template模板來搭建CAS 服務端
5.搭建CAS的客戶端.咱們須要學習普通項目集成CAS客戶端以及SpringBoot項目集成CAS客戶端.php
目錄章節:java
Web環境中的會話指一個瀏覽器與交互系統進行通訊的時間間隔,一般指從註冊進入系統到註銷退出系統之間所通過的時間,瀏覽器和服務器之間的會話是經過本地的cookie來實現的,經過下圖加深理解:web
瀏覽器訪問流程數據庫
1.瀏覽器在第一次訪問Tomcat服務器的時候,Tomcat服務器會在服務端建立session對象,並存儲到map中.key是session的id,value是session對象自己.
2.在響應的時候會把session的id經過cookie的方式寫到客戶端瀏覽器中.
3.瀏覽器會在本地的目錄中把session的id寫入到本地的cookie中.
4.在後續的請求中,都會讀取本地的cookie中的內容,並在請求的時候帶上對應的cookie.瀏覽器
服務端的session和客戶端的cookie如何存儲的,請看下面這張圖:tomcat
cookie和session的存儲安全
有了會話機制,登陸狀態就好明白了,咱們假設瀏覽器第一次請求服務器須要輸入用戶名與密碼驗證身份,服務器拿到用戶名密碼去數據庫比對,正確的話說明當前持有這個會話的用戶是合法用戶,應該將這個會話標記爲「已受權」或者「已登陸」等等之類的狀態,既然是會話的狀態,天然要保存在會話對象中,Tomcat在會話對象中設置登陸狀態以下:服務器
HttpSession session = request.getSession(); session.setAttribute("isLogin", true);
用戶再次訪問時,tomcat在會話對象中查看登陸狀態:cookie
HttpSession session = request.getSession(); session.getAttribute("isLogin");
實現了登陸狀態的瀏覽器請求服務器模型以下圖描述:session
登錄機制
每次請求受保護資源時都會檢查會話對象中的登陸狀態,只有 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/9dc... 來源:簡書 著做權歸做者全部。商業轉載請聯繫做者得到受權,非商業轉載請註明出處。