一、單點登錄流程
=====客戶端======
1.攔截客戶端的請求判斷是否有局部的session
2.1如果有局部的session,放行請求.
2.2如果沒有局部session
2.2.1請求中有攜帶token參數
2.2.1.1如果有,使用HttpURLConnection發送請求校驗token是否有效.
2.2.1.1.1如果token有效,建立局部的session.
2.2.1.1.2如果token無效,重定向到統一認證中心頁面進行登陸.
2.2.1.2如果沒有,重定向到統一認證中心頁面進行登陸.
2.2.2請求中沒有攜帶token參數,重定向到統一認證中心頁面進行登陸.
=====服務端=====
1.檢測客戶端在服務端是否已經登錄了.(checkLogin方法)
1.1獲取session中的token.
1.2如果token不為空,說明服務端已經登錄過了,此時重定向到客戶端的地址,並把token帶上
1.3如果token為空,跳轉到統一認證中心的的登錄頁面,並把redirectUrl放入到request域中.
2.統一認證中心的登錄方法(login方法)
2.1判斷用戶提交的賬號密碼是否正確.
2.2如果正確
2.2.1創建token(可以使用UUID,保證唯一就可以)
2.2.2把token放入到session中,還需要把token放入到數據庫表t_token中
2.2.3這個token要知道有哪些客戶端登陸了,存入數據庫t_client_info表中.);
2.2.4轉發到redirectUrl地址,把token帶上.
2.3如果錯誤
轉發到login.jsp,還需要把redirectUrl參數放入到request域中.
3.統一認證中心認證token方法(verifyToken方法),返回值為String,貼@ResponseBody
3.1如果MockDatabaseUtil.T_TOKEN.contains(token)結果為true,說明token是有效的.
3.1.1返回true字符串.
3.1如果MockDatabaseUtil.T_TOKEN.contains(token)結果為false,說明token是無效的,返回false字符串.
二、單點注銷流程
=====客戶端======
1.在登陸的按鈕鏈接寫上統一認證中心的登出方法即可.
<a href=”http://www.sso.com/logOut”>退出</a>
2.校驗令牌信息的同時把客戶端登出地址(clientUrl)和客戶端會話id(jsession)一並的傳到統一認證中心
=====服務端=====
1.編寫logOut方法,調用session.invalidate()
2.創建session的監聽器,在session的監聽器的銷毀方法寫如下邏輯
2.1獲取session中的token.
2.2根據token獲取所有客戶端的登出地址和會話id
2.3通過HttpUtil選項調用客戶端的登出方法.
三、開源軟件CAS
CAS(Central Authentication Service) 是 Yale (耶魯)大學發起的開源的企業級單點登錄系統。它的特點:
Java (Spring Webflow/Spring Boot) 服務組件
可插拔身份驗證支持(LDAP,Database,X.509,MFA)
支持多種協議(CAS,SAML,OAuth,OpenID,OIDC)
跨平台客戶端支持(Java,.Net,PHP,Perl,Apache等)
與uPortal,Liferay,BlueSocket,Moodle,Google Apps等集成
分為CAS Server服務端和CAS Client客戶端:
CAS Server:
CAS Server 負責完成對用戶的認證工作, CAS Server 需要獨立部署,有不止一種 CAS Server 的實現, Yale CAS Server 和 ESUP CAS Server 都是很不錯的選擇。
CAS Server 會處理用戶名 / 密碼等憑證 (Credentials) ,它可能會到數據庫檢索一條用戶帳號信息,也可能在 XML 文件中檢索用戶密碼,對這種方式, CAS 均提供一種靈活但同一的接口 / 實現分離的方式, CAS 究竟是用何種認證方式,跟 CAS 協議是分離的,也就是,這個認證的實現細節可以自己定制和擴展.
CAS Client:
CAS Client 負責部署在客戶端(注意,我是指 Web 應用),原則上, CAS Client 的部署意味着,當有對本地 Web 應用的受保護資源的訪問請求,並且需要對請求方進行身份認證, Web 應用不再接受任何的用戶名密碼等類似的 Credentials ,而是重定向到 CAS Server進行認證。
目前, CAS Client 支持(某些在完善中)非常多的客戶端,包括 Java 、 .Net 、 ISAPI 、 Php 、 Perl 、 uPortal 、 Acegi 、 Ruby 、VBScript 等客戶端,幾乎可以這樣說, CAS 協議能夠適合任何語言編寫的客戶端應用。
第一二部分的源碼:https://github.com/yyzmain/ssoDemo
轉自:https://blog.csdn.net/wolfcode_cn/article/details/80773274