系統間帳號認證系統同步方案html
基礎原理:(基於Web)git
瀏覽器在個請求傳遞cookie到服務器,服務器對cookie增刪改查的操做, 寫入JSessionId實現與服務器Session的綁定,保持會話github
單機狀況下:一個域名,對應一個cookie,對應一個JsessionId,與一個服務器Session會話redis
基於原理解決方案須要解決兩個問題:spring
1. Cookie在不一樣域名(系統)間的傳遞問題segmentfault
2. 服務器Session在不一樣服務器瀏覽器
問題1的解決方案:緩存
cookie中的數據有三個屬性:domain、path、name。cookie新增和刪除,沒有修改選項,name相同,domain以及path不一樣,當作不一樣的cookie來處理服務器
又衍生出了兩種狀況:cookie
在同一個域名以及子域名下面的處理方式:使用domain綁定頂級域名
在不一樣域名下面的系統的處理方式:經過sso的模式,傳遞ticket,驗證ticket獲取用戶信息,生成本身的sessionId到cookie中
問題2的解決方案:
部署在同一臺服務器:使用堆外內存,磁盤緩存來實現:ehcache
部署在不一樣服務器:使用redis、memcache緩存來實現
實現方式:
框架:spring-session、shiro-SessionManager模塊、使用redis客戶端
自研:修改實現JavaEE關於Session的增刪改查,實現分佈式回話
上述問題比較麻煩的就是不一樣域名下系統的解決方案:單點登陸
底層方案:
JavaEE接入Cas的客戶端和服務端實現手動實現單點登陸
使用框架:
spring-cas
shiro整合cas
其餘方式:
零侵入整合業務系統:https://www.cnblogs.com/baibaomen/p/sso.html
Tomcat容器其實實現了對應的Cookie的配置,可是過於依賴容器,在代碼中實現,而非在運維層面上實現是更好的選擇。
參考資料:
單點登陸時序圖:https://www.cnblogs.com/baibaomen/p/sso-sequence-chart.html
github單點登陸資料:https://github.com/baibaomen/BaibaomenSsoLesson
域名之間的cookie共享狀況:https://segmentfault.com/a/1190000006932934?utm_source=tag-newest
JavaEE基礎教程書籍:《JavaWeb整合開發王者歸來》熟悉JavaEE基本對象以及基礎流程以及原理,容器只是基礎規範的實現