有個問題 我以前一直弄不清楚 那就是 在登入第乙個系統之後 如何登入第二個系統
我以為是通過超連結進去的 但是看了那麼多的資料 又覺得 應該是在位址列直接輸位址進去的
可是這樣新的問題就來了 登入第二個系統的時候 如何知道第乙個系統已經登入了 靠什麼傳輸乙個標誌
這個問題 我到目前為止想到 兩種解決方案
1. 使用response的sendredirect的方法
使用這個方法 伺服器端接收的方式一定是get 而且這個方法 不能帶太多的引數
這個方法的妙處就在於 使用這個方法後 是瀏覽器自己重新再次傳送了一次請求
這不是重點 重點是:
如果之前有發過請求,那麼再次傳送的時候 瀏覽器會自己把cookie帶上 對的這種實現單點登入的核心就是這個方法 間接 的利用瀏覽器 儲存會話的標誌從而實現單點登入
但是這樣的做的問題就是
如果瀏覽器你的資料被你清除過,那麼 這種方法 就不奏效了 不過鑑於這種情況應該不會發生 瀏覽器清除資料 一般都是退出後 沒有人會在使用的時候刪掉的。
-******
這裡我還想補充一點 :網上還有一種解決思路 就是網域名稱保持一致 但是這樣會因為語言不同 web伺服器不同造成差異 比如說tomcat是jsessionid 其他的是什麼的
看到這個問題 我覺得的有點搞笑 感覺寫部落格的人 可能沒有搞過這個 只是隨便的複製黏貼別人的東西 這裡cookie的name和value都是可以在後台指定的,不一定非要使用預設的啊
******我就是皮一下 或許還有其他的問題 我也是最近開始搞這一塊的東西
2. 不使用跳轉機制 直接訪問服務,只是把請求的路徑作為引數傳送給sso伺服器,還是返回乙個token
但是瀏覽器這樣會話的標誌如何解決?
我想了乙個解決的方案:
多系統之間有乙個信任區 在這個區裡面 只要登入了乙個 那麼另外幾個也是 可以訪問的 這個時候 客戶端先是本地判斷使用者未登入,然後將實際的訪問路徑作為引數傳送到 sso伺服器 伺服器根據請求路徑 和請求資訊的ip什麼的(主要是用這些資訊定位是哪台機器 用什麼瀏覽器發出的,如果在再粗略一點 直接定位是哪個ip發出的),之後根據請請求路徑確定 要訪問的是哪個信任區 在這個信任區下是否 發出該請求的使用者有登陸過 如果有那就直接放行 如果沒有 那就讓他登入
下面舉個例子說明這種解決方案
我們這裡有 系統1 系統2 系統3 這三個系統互相信任 還有另外乙個 sso伺服器
現在有乙個使用者的ip是 153.152.85.20
假設他 通過瀏覽器
登入了系統1 正常的登入流程 且登入成功
現在要訪問系統2
系統2攔截請求 發現沒有登入 將訪問路徑作為引數 去sso伺服器去做驗證
sso根據請求判斷該使用者的ip是什麼 以及該請求所在的信任區 去信任區下尋找 是否該ip下的使用者(這裡不一定要用ip 主要是可以標識這個請求來自**就可以了)是否已經登陸過了 找到就返回對應的資訊 這裡發現他登陸過系統1 所以直接放行
這裡是一種解決方案 還有更加細緻的許可權管理 臨時會話什麼的
總結下:
單點登入最大的問題 在於第二個或者說後面的系統如何知道這台機器下 (這個瀏覽器下) 這個使用者已經登入 不用再登陸了,處理了這個問題 後面的許可權管理 臨時會話什麼的就好解決了
目前解決單點登入的產品
spring-session
cas apache乙個開源產品 很細緻 不過也很複雜 分為客戶端和服務端 要使用ssh密碼什麼的 比較複雜 我之前弄過 不過成了一般
對於問題的話還是要先搞清楚怎麼做 怎麼解決才是最好的
單點登入思路
思路 需要乙個專門負責登入的sso系統 先說登入 a b兩個系統登入時,以a系統舉例,先在自己系統判斷有沒有登入根據session中是否有sso中返回的token,沒有登入的就去sso系統校驗是否已經登入 也是通過session 未登入的 未登入,則登入 設定session,並建立token,使用r...
單點登入解決方案
本文只是簡述單點登入解決方案,系統其他方面均省略 如上圖 系統基本架構 fr與es分為兩個不同的子專案,前端請求均通過訪問fr,由fr通過httpurlconnection訪問es 賦能層 fr主要作用為登入鑑權。大致請求流程如下 1 password md5單向加密成新的password 1 如 ...
實現單點登入功能的思路以及kafka同步資料
單點登入以及使用者資料同步思路與方案 當公司業務分布於多個子系統時,同一使用者在a系統註冊,即可在其他所有關聯系統使用,並支援登入a系統後,自動在其他系統登入,退出同理。在a平台修改通用的使用者資料 比如密碼 及時通知其它平台進行更新資料。每個系統有自己單獨的使用者表,用於各自的業務邏輯,但使用者i...