天天看點

cas 登入之後不跳轉_程式設計概念精講(二):單點登入(SSO)詳解

文章首發于公衆号【程式員讀書】,歡迎關注。

這是《程式設計概念精講》系列第二篇文章,在這篇文章中我們來聊一聊

單點登入

的機制!

什麼是單點登入

為什麼需要單點登入

在我們的系統還隻是一個單體應用的時候,我們并不需要單點登入的功能,因為系統隻有一個,使用者在使用系統時隻要登入一次就可以了,這時候我們的系統應該是下面這樣子的:

cas 登入之後不跳轉_程式設計概念精講(二):單點登入(SSO)詳解

然而,随着業務的發展,系統會越來越大,于是我們不得不将系統進行拆分,一個龐大的系統會分出不同的子系統,而每個子系統都需要驗證使用者是否已經登入,這個時候我們系統應該是下面這樣子的:

cas 登入之後不跳轉_程式設計概念精講(二):單點登入(SSO)詳解

可以看出來,在系統拆分後,每個子系統都需要自己的登入功能,這時候可以将登入認證子產品單獨變成一個系統,通路任何需要登入後才能通路的内容,都是需要先到登入系統進行登入認證成功後才能繼續通路,這時候我們的系統會變成下面這樣子:

cas 登入之後不跳轉_程式設計概念精講(二):單點登入(SSO)詳解

這就是所謂單點登入,下面我們來更詳細地了解一下。

單點登入的概念

單點登入,英文全稱為

Single Sign-On

,簡寫為

SSO

,其定義是指在多個應用系統中,使用者隻需要登入一次就可以通路所有互相信任的應用系統。

從上面的定義來看,單點登入的作用就是使用者隻要一次登入,相關的系統不用再次登入就可以通路,另外,也可以将使用者的權限集中管理,而不用在各個子系統中授權。

單點登入的實作

既然我們知道随着業務發展,系統拆分,我們的系統會越來越多,實作單點登入不可能避免,那麼要如何實作呢?

要實作單點登入,需要先将登入認證功能單獨抽出來,變成一個獨立的

SSO認證中心

,進行登入認證與權限控制,而其他子系統不提供登入認證功能。

當使用者通路子系統受限資源時,如果判斷未登入,都跳轉到認證中心進行登入認證。

一般下面兩種實作方式,如下:

同域名下系統的單點登入

如果我們折分後的子系統,部署在同一個一級域名之下,比如

order.test.com

user.test.com

,就可以利用浏覽器中,二級域名或以讀取一級域名

Cookie

的機制來實作單點登入,具體有下面兩種做法:

完全使全cookie來實作

登入

  1. 使用者通路某個子系統(比如訂單管理系統)時,如果沒有登入,則跳到

    SSO認證中心

    登入認證。
  2. 登入認證成功後,将可以驗證使用者的資訊通過加密後儲存到一級域名(在這裡是

    .test.com

    )的cookie中,并跳到子系統中。
  3. 子系統可以讀取到cookie,解密得到使用者資訊并按校驗規則進行校驗後判斷使用者有效,并完成使用者登入。

登出

登出的邏輯也比較簡單,使用者請求SSO認證系統進行登入登出時,SSO認證中心隻要删除浏覽器上的cookie就可以了。

cookie與session共同參與

單純通過cookie來實作,并不是很靈活,也并不是很安全,是以也可以配合session一起完全單點登入功能。

這種方式與單純使用cookie登入差不多,唯一不同的使用者登入成功後,cookie儲存了sessionid,使用者通路時,通過cookie中儲存的sessionid通路session中的使用者資料,這種方式要求不同的子系統可以通路session。

CAS原理

上面講的是一種在同域名實作單點登入的方式,比較簡單,但如果我們的系統部署在不同的域名下呢?這時候要如何實作單點登入呢?

其實單點登入有一套标準的流程的,叫CAS流程,CAS全稱為

Central Authentication Service

,中文叫中央認證伺服器,在這裡我們稱為SSO認證中心(

CAS Server

)。

CAS Server

提供登入認證功能,各個子系統相當于用戶端(

CAS Client

),在需要使用者登入時,向

CAS Server

發起登入請求。

CAS流程的登入機制

我們假設使用者先在訂單管理系統上通路受限資源,其登入登出如下:

  1. 使用者通路訂單管理系統受限制資源。
  2. 訂單管理系統判斷使用者未登入。
  3. 訂單管理系統帶上使用者通路位址,跳轉到SSO認證中心登入頁面。
  4. 使用者輸入賬号密碼認證成功後,建全局會話(cookie),并生成Token。
  5. SSO認證中心攜帶Token跳轉訂單管理系統。
  6. 訂單管理系統擷取Token值,通過SSO認證中心校驗Token是否有效,如有效,則建立局部session,完成登入在訂單管理系統的登入。
上面流程的示意圖如下所示
cas 登入之後不跳轉_程式設計概念精講(二):單點登入(SSO)詳解

一個子系統登入後,接下來我們來看看另一個子系統的登入流程,我們現在進入的是商品管理系統:

  1. 使用者通路商品管理系統受限制資源。
  2. 商品管理系統判斷使用者未登入。
  3. 商品管理系統帶上使用者通路位址,跳轉到SSO認證中心登入頁面,此時會攜帶上面已經建立的全局Cookie。
  4. SSO認證中心擷取Cookie後判斷使用者已經登入。
  5. SSO認證中心攜帶Token跳轉商品管理系統
  6. 商品管理系統擷取Token值,通過SSO認證中心校驗Token是否有效,如有效,則建立局部session,完成登入在訂單管理系統的登入。
上面示意圖如下所示:
cas 登入之後不跳轉_程式設計概念精講(二):單點登入(SSO)詳解

CAS流程的登出機制

既然有了單點登入,那麼就需要單點登出了,單點登出要保證的是在其中一個子系統中登出後,其他子系統的登入狀态也會一并登出。

我們仍假設使用者在訂單管理系統中發起登出登入操作,具體流程如下:

  1. 使用者在訂單系統中發起登出登入請求。
  2. 訂單根據使用者在目前系統建立的會話id拿到令牌(Token),向

    SSO認證中心

    發起登出請求。
  3. SSO認證中心

    校驗Token是否有效,如果有效則銷毀全局會話,同時取出所有用此令牌注冊的系統位址。
  4. SSO認證中心

    向所有注冊的子系統發起登出請求。
  5. 各注冊系統接收

    SSO認證中心

    的登出請求,銷毀局部

    session

  6. SSO認證中心

    将使用者重定向到登入頁面(或者其他頁面)。

小結

總結一下,通過單點登入,使用者隻要登入一次,便可能通路不同的系統,而不用多次登入,而實作單點登入,也有兩種方式,一個是同域名下的單點登入實作,一種是采用通過的CAS流程,具體選擇哪一種,可以根據自己系統的實際需求。

文章首發于公衆号【程式員讀書】,歡迎關注。
cas 登入之後不跳轉_程式設計概念精講(二):單點登入(SSO)詳解

繼續閱讀