文章首發于公衆号【程式員讀書】,歡迎關注。
這是《程式設計概念精講》系列第二篇文章,在這篇文章中我們來聊一聊
單點登入
的機制!
什麼是單點登入
為什麼需要單點登入
在我們的系統還隻是一個單體應用的時候,我們并不需要單點登入的功能,因為系統隻有一個,使用者在使用系統時隻要登入一次就可以了,這時候我們的系統應該是下面這樣子的:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yNlJGOjRmM5YWM1MTYwYTZzIWNhZ2NxkDZ5QDNzMDOi9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
然而,随着業務的發展,系統會越來越大,于是我們不得不将系統進行拆分,一個龐大的系統會分出不同的子系統,而每個子系統都需要驗證使用者是否已經登入,這個時候我們系統應該是下面這樣子的:
可以看出來,在系統拆分後,每個子系統都需要自己的登入功能,這時候可以将登入認證子產品單獨變成一個系統,通路任何需要登入後才能通路的内容,都是需要先到登入系統進行登入認證成功後才能繼續通路,這時候我們的系統會變成下面這樣子:
這就是所謂單點登入,下面我們來更詳細地了解一下。
單點登入的概念
單點登入,英文全稱為
Single Sign-On
,簡寫為
SSO
,其定義是指在多個應用系統中,使用者隻需要登入一次就可以通路所有互相信任的應用系統。
從上面的定義來看,單點登入的作用就是使用者隻要一次登入,相關的系統不用再次登入就可以通路,另外,也可以将使用者的權限集中管理,而不用在各個子系統中授權。
單點登入的實作
既然我們知道随着業務發展,系統拆分,我們的系統會越來越多,實作單點登入不可能避免,那麼要如何實作呢?
要實作單點登入,需要先将登入認證功能單獨抽出來,變成一個獨立的
SSO認證中心
,進行登入認證與權限控制,而其他子系統不提供登入認證功能。
當使用者通路子系統受限資源時,如果判斷未登入,都跳轉到認證中心進行登入認證。
一般下面兩種實作方式,如下:
同域名下系統的單點登入
如果我們折分後的子系統,部署在同一個一級域名之下,比如
order.test.com
與
user.test.com
,就可以利用浏覽器中,二級域名或以讀取一級域名
Cookie
的機制來實作單點登入,具體有下面兩種做法:
完全使全cookie來實作
登入
- 使用者通路某個子系統(比如訂單管理系統)時,如果沒有登入,則跳到
登入認證。SSO認證中心
- 登入認證成功後,将可以驗證使用者的資訊通過加密後儲存到一級域名(在這裡是
)的cookie中,并跳到子系統中。.test.com
- 子系統可以讀取到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流程的登入機制
我們假設使用者先在訂單管理系統上通路受限資源,其登入登出如下:
- 使用者通路訂單管理系統受限制資源。
- 訂單管理系統判斷使用者未登入。
- 訂單管理系統帶上使用者通路位址,跳轉到SSO認證中心登入頁面。
- 使用者輸入賬号密碼認證成功後,建全局會話(cookie),并生成Token。
- SSO認證中心攜帶Token跳轉訂單管理系統。
- 訂單管理系統擷取Token值,通過SSO認證中心校驗Token是否有效,如有效,則建立局部session,完成登入在訂單管理系統的登入。
一個子系統登入後,接下來我們來看看另一個子系統的登入流程,我們現在進入的是商品管理系統:
- 使用者通路商品管理系統受限制資源。
- 商品管理系統判斷使用者未登入。
- 商品管理系統帶上使用者通路位址,跳轉到SSO認證中心登入頁面,此時會攜帶上面已經建立的全局Cookie。
- SSO認證中心擷取Cookie後判斷使用者已經登入。
- SSO認證中心攜帶Token跳轉商品管理系統
- 商品管理系統擷取Token值,通過SSO認證中心校驗Token是否有效,如有效,則建立局部session,完成登入在訂單管理系統的登入。
CAS流程的登出機制
既然有了單點登入,那麼就需要單點登出了,單點登出要保證的是在其中一個子系統中登出後,其他子系統的登入狀态也會一并登出。
我們仍假設使用者在訂單管理系統中發起登出登入操作,具體流程如下:
- 使用者在訂單系統中發起登出登入請求。
- 訂單根據使用者在目前系統建立的會話id拿到令牌(Token),向
發起登出請求。SSO認證中心
-
校驗Token是否有效,如果有效則銷毀全局會話,同時取出所有用此令牌注冊的系統位址。SSO認證中心
-
向所有注冊的子系統發起登出請求。SSO認證中心
- 各注冊系統接收
的登出請求,銷毀局部SSO認證中心
。session
-
将使用者重定向到登入頁面(或者其他頁面)。SSO認證中心
小結
總結一下,通過單點登入,使用者隻要登入一次,便可能通路不同的系統,而不用多次登入,而實作單點登入,也有兩種方式,一個是同域名下的單點登入實作,一種是采用通過的CAS流程,具體選擇哪一種,可以根據自己系統的實際需求。
文章首發于公衆号【程式員讀書】,歡迎關注。