一篇文章教你學會單點登錄與cas

大家好 ,我是才淺。今天想跟大家講講關於單點登錄的那些事,在面試過程中有時候會被問到單點登錄,那麼單點登錄又稱之爲Single Sign On,簡稱SSO,單點登錄可以通過基於用戶會話的共享,來實現登錄一個網站其他網站就不用再次登錄功能。由於域名的原因分爲‘相同頂級域名’和‘不同頂級域名’單點登錄兩種。
今天我希望用簡單的方式就把兩種的實現方案都給他講透說明白嘍,這樣以後無論是工作中還是面試中如果有這方面的問題都可以用到。
如果覺得看的還可以,希望可以給我點個贊,您的贊是我寫作的最大動力。

一。什麼是單點登錄

單點登錄又稱之爲Single Sign On,簡稱SSO,單點登錄可以通過基於用戶會話的共享。利用單點登錄可以實現用戶只登錄一次就可以訪問幾個不同的網站。用戶自始至終只在某一個網站下登錄後,那麼他所產生的會話,就共享給了其他的網站,實現了單點網站登錄後,同時間接登錄了其他的網站,那麼這個其實就是單點登錄,他們的會話是共享的,都是同一個用戶會話。
例如:登錄了qq,那麼qq音樂,qq視頻之類的就都不用登錄了,可以直接訪問。

二。相同頂級域名的單點登錄解決方案

因爲是相同的頂級域名,頂級域名和下級域名之間cookie是共享的,這樣通過cookie+redis就可以實現單點登錄。
如果分佈式會話後端是基於redis的,如此會話可以流竄在後端的任意系統,都能獲取到緩存中的用戶數據信息,前端通過使用cookie,可以保證在同域名的一級二級站點下獲取,那麼這樣一來,cookie中的信息userid和token是可以在發送請求的時候攜帶上的,這樣從前端請求後端後是可以獲取拿到的,這樣一來,其實用戶在某一端登錄註冊以後,其實cookie和redis中都會帶有用戶信息,只要用戶不退出,那麼就能在任意一個站點實現登錄了。

那麼這個原理主要也是cookie和網站的依賴關係,頂級域名 和下級域名的cookie值是可以共享的,可以被攜帶至後端的。
二級域名自己的獨立cookie是不能共享的,不能被其他二級域名獲取,比如:a.abc.com的cookie是不能被b.abc.com共享,兩者互不影響,要共享必須設置爲.abc.com。
在這裏插入圖片描述

三。不同頂級域名的單點登錄解決方案

那麼如果頂級域名都不一樣,咋辦?比如 www.aaa.com要和www.bbb.com的會話實現共享,這個時候又該如何?!如下圖,這個時候的cookie由於頂級域名不同,就不能實現cookie跨域了,每個站點各自請求到服務端,cookie無法同步。比如,www.aaa.com下的用戶發起請求後會有cookie,但是他又訪問了www.bbb.com,由於cookie無法攜帶,所以會要你二次登錄。
因爲不同頂級域名,cookie直接是不共享的,所以就不能用cookid+reids這種方式來做單點登錄了,這個時候我們可以用cas來實現單點登錄.

CAS全稱爲Central Authentication Service即中央認證服務
在這裏插入圖片描述

如圖所示,各個系統之間的登錄會通過一個獨立的登錄系統去做驗證,它就相當於是一箇中介公司,整合了所有人,你要看房經過中介允許拿鑰匙就行,實現了統一的登錄。那麼這個就稱之爲CAS系統,CAS全稱爲Central Authentication Service即中央認證服務,是一個單點登錄的解決方案,可以用於不同頂級域名之間的單點登錄。

四。cas系統詳解

CAS全稱爲Central Authentication Service即中央認證服務,是一個單點登錄的解決方案,可以用於不同頂級域名之間的單點登錄。

初次登錄流程解析:
  1. 當用戶訪問到A網站的時候,網站會首先判斷他是否在cas系統登錄過,如何判斷是否登錄呢?主要是在cookid中看是否有登錄信息。如果沒有登錄,網站會攜帶上自己的url去訪問cas系統登錄接口。
  2. 當cas系統接受到這樣一個請求會,會查看自己是否有cookie,如果沒有會彈出登錄窗口讓用戶登錄。
  3. 如果用戶登錄成功後,cas系統會進行三步處理
    3.1. 創建用戶會話,把用戶的信息作爲值,把用戶的id作爲健存入到redis或者其他數據庫中,用來在用戶登錄進來後獲取用戶信息
    3.2 創建用戶全局門票,把用戶id作爲值,隨機數當作健存入redis和cookie中,用以表示在CAS端是否登錄
    3.3 創建臨時門票,把隨機數當作健值存入redis中,用於回跳回傳
  4. 將臨時票據作爲參數回調回A網站
  5. 當A網站有臨時票據後會把拿着這個票據訪問cas的兌換票據接口
  6. cas兌換票據接口會做這樣幾件事
    6.1. cas會先判斷這個票據是否是合法票據
    6.2. 如果是合法票據,就把這個臨時票據銷燬,然後通過cas中的cookie信息去獲取到用戶id
    6.2. 在通過用戶id獲取到全局會話,把會話傳遞會A界面
    7.當A界面獲取到會話後,存入自己的cookie中,這樣以後就不用再去請求cas了
二次訪問流程

1.當用戶訪問到B網站後,B網站也會判斷他是否在cas系統登錄過,如果沒有cookie信息(注意:這個時候會有兩個cooklie信息,一個是用戶的全局會話,一個是cas的全局門票,這裏說的沒有cookie信息,說的是沒有全局會話),網站會攜帶上自己的url去訪問cas系統登錄接口。
2.因爲這個時候cas系統發現有cookie信息,證明用戶已經登錄過了,那就只要在創建一個臨時票據回傳給B網站就好了。
3. 其他剩下操作與第一次訪問相同。

cas系統流程圖

在這裏插入圖片描述

舉例說明

cas系統可以看成是一個公園,公園需要買票才能進入,但是可能公園中的有一些景點一張票只能玩一次,需要用門票去換取一次性票據去遊玩,在門口買的票就相當於CAS系統的全局門票和用戶全局會話。只能玩一次換的一次性票據就相當於臨時票據。

總結

首先跟大家普及了一下什麼是單點登錄,單點登錄在分佈式中用的還是蠻多的,並且跟大家分享了一下兩種單點登錄的實現方案,大家如果對單點登錄有興趣的話,我會在下一篇給大家徒手擼一個cas系統。如果對文章有什麼建議或者疑問也可以給我留言。

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