單點登錄系統SSO——理論

關於SSO一直沒有深入的研究,在工作中也是對接的公司平臺的SSO,最近頻繁的與SSO打交道之後,我決定深入的理解一下它的實現原理;

一.SSO的實現種類

SSO系統在公司一般是獨立部署的一套系統,需要各業務系統接入,回想一下之前傳統系統都是業務+登錄一體化,那個時候,我們可以將用戶信息保存到session,那如果是微服務+獨立SSO該怎麼實現各系統session共享的問題?

1.基於共享session

我們都知道每臺服務的session是互相不共享的,假設將我們的 商品服務、訂單服務等服務的session都共享,就可以實現一處登錄,全站訪問的特點;

實現共享session的方式不是本文的重點,它存在一定的缺陷,就是所有的服務器都必須保持一致,不能說有些服務是tomcat,有些是jetty;
提升一種思路就是通過 Spring Session 或者 tomcat-redis-session-manager

2.基於認證中心

這種方案需要自己實現一套SSO或使用第三方的,所有系統的認證操作都是在這個系統中完成的,它管理着整個用戶的狀態,這種實現方式需要SSO系統提供有登錄、註冊等操作的前端頁面。下面重點介紹下實現方式;

二.實現方式

我們模擬三個服務:
系統A:a.demo.com
系統B:b.demo.com
SSO:sso.demo.com

1.登錄流程

單點登錄系統SSO——理論

關鍵點:

1.它用到了兩個cookie(sid與token)和三次重定向;
2.token是寫到a.demo.com域名下的,sid是寫到sso.demo.com域名下的;
3.在驗證token的時候,如何知道當前用戶已經創建了全局會話?因爲jwt的payload裏面存儲了之前創建sso的會話sid,所以當cas拿到jwt,就相當於知道了sid;

注意:
SSO服務如果是集羣部署的,則需要解決sid共享問題;

2.訪問系統B的頁面

單點登錄系統SSO——理論

在這個過程中關鍵在於第一次重定向的時候,它會把sso.demo.com這個域名下的sid帶給sso服務;

3.退出

單點登錄系統SSO——理論

最重要的是要清除sid的cookie,jwt的cookie可能業務系統都有創建,所以不可能在退出的時候還挨個去清除,只要sid一清除,那麼即使那些jwt的cookie在下次訪問的時候還會被傳遞到業務系統有服務端;

三.總結

在真實的項目中,可能需要考慮到更多的安全性的要求,比如:
1.使用https
2.http-only
3.CSRF
總的來說,優缺點主要有:

1.能夠支持跨平臺,跨語言實現單點登錄;
2.重寫向次數過多;
3.每次請求都需要調用SSO驗證token有效性;

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