基於redis的單點登入解決方案

2021-10-22 14:33:13 字數 1048 閱讀 4433

單點登入有兩種模型,一種是共同父域下的單點登入(例如網域名稱都是 xx.a.com),還有就是完全跨域下的單點登入(例如網域名稱是xx.a.com,xx.b.com),本文我們講一下完全跨域下的單點登入該怎麼實現。

基於安全考慮,想通過cookie來實現這個功能是不太可能的了(也許有其他黑科技可以實現,這裡不做討論)。這裡介紹的方案是參考shiro框架的跨域session共享方案來實現的。我們知道瀏覽器訪問系統的時候會生成乙個session,那麼每次請求如何知道是來自同乙個瀏覽器呢?是因為瀏覽器為每個域儲存了乙個可以稱作為session的cookie的東西,每次請求該域都會把對應的這個cookie帶上,然後伺服器根據這個cookie值去查詢對應的session。

想要達到完全跨域的單點登入要滿足兩個條件:

第乙個條件通過使用spring-session框架把session儲存在redis中,可以很容易實現。

那麼第二個條件如何實現呢?答案就是想方法為每個域設定相同的session的cookie 。

舉個例子,比如有a、b兩個站點網域名稱分別是www.a.com,www.b.com,這兩個網域名稱需要共享session,並且已b網域名稱下的session為主,a登入時跳轉到b域進行登入,成功登入之後重定向到a時把sessionid帶上,a站點拿到sessionid之後回寫到瀏覽器覆蓋原來生成的session的cookie。這時再次訪問a站點用的就是同乙個session了。大概畫乙個圖如下:

上述方案可以實現完全跨域下的單點登入,但是存在乙個很大的問題,就是安全問題!

假如在第④步操作重定向回a站點時,請求鏈結被不法分子攔截到了,他拿著這個鏈結就可以直接訪問a站點了。

安全問題解決方案如下圖:

其實⑥、⑦兩步主要要解決的問題是,向b(認證伺服器)證明:「我請求認證我是合法請求,我不是非法請求」。認證成功後,返回sessionid。

基於Redis實現的單點登入

背景 每個web應用都有自己的session,那如何在分布式或者集群環境下統一session,即如何實現單點登入,如下圖 解決方案 把session資料存放在redis,統一管理,向外提供服務介面,redis可以設定過期時間,對應session的失效時間 優點 訪問速度快,效率高 無單點故障,可以部...

單點登入 基於code

前後端分離專案 const singlelogin async const gotoindex async code string 0 return 如果失敗去設定使用者錯誤資訊 setuserloginstate msg catch error setsubmitting false useeff...

C 基於Redis快取實現單點登入SSO的例項

最近公司的多個業務系統要統一整合使用同乙個登入,這就是我們耳熟能詳的單點登入,現在就net基於redis快取實現單點登入做乙個簡單的分享。單點登入 single sign on 簡稱為 sso,是目前比較流行的企業業務整合的解決方案之一。sso的定義是在多個應用系統中,使用者只需要登入一次就可以訪問...