最近輪到我在小組晨會來分享知識點,突然想到單點登錄,準備來分享下如何實現單點登錄,所以有了下文。實現方案以及代碼可能寫得不是很嚴謹,有漏洞的地方或者錯誤的地方歡迎大家指正。

剛開始頭腦中沒有思路,直接在博客園里面看看別人是如何來實現的,看了幾篇文章發(fā)現,發(fā)現解決方案有點問題,或者說不算實現了單點登錄。最近輪到我在小組晨會來分享知識點,突然想到單點登錄,準備來分享下如何實現單點登錄,所以有了下文。實現方案以及代碼可能寫得不是很嚴謹,有漏洞的地方或者錯誤的地方歡迎大家指正。

名稱定義

為了方便說明先說明幾個文中出現的名詞的含義:

P站:統一登錄授權驗證中心,demo中 域名是www.passport.com:801

A站:處于不同域名下的測試網站,demo中 域名是www.a.com:802

B站:處于不同域名下的測試網站,demo中 域名是www.b.com:803

Token:用戶訪問P站的秘鑰
Ticket:用來保存用戶信息的加密字符串

單點登錄

訪問A站需要登陸的就跳轉P站中進行登陸,P站登陸之后跳轉回至A站,用戶再次訪問B站需要登陸的頁面,用戶不需要進行登陸操作就可以正常訪問。

實現思路

未登錄用戶訪問A站,首先會重定向跳轉至P站授權中心,P站首先通過檢測Cookie來判斷當前不是處于登陸狀態(tài),就跳轉至登陸頁面進行登陸操作,登陸成功之后把用戶信息加密ticket附在A的請求地址上返回,A站通過解密ticket來獲取用戶信息,解密成功并存進Session中(這樣用戶在A中就處于登陸狀態(tài)了),訪問通過;當用戶再次訪問B站的時候,對于B站來說,用戶是處于未登錄狀態(tài),則同樣會重定向跳轉至P站授權中心,P站檢測Cookie,判斷當前用戶處于登陸狀態(tài),就把當前用戶信息加密成ticket附在B的請求地址上返回,后面的操作就和A站處理一樣;這樣都登陸之后再次訪問A或者B,A和B中Session中都存儲了用戶信息,就不會再次請求P站了。

簡單關系圖

泳道流程圖