有個問題 我之前一直弄不清楚 那就是 在登陸第一個系統以後 如何登陸第二個系統web
我覺得是經過超連接進去的 可是看了那麼多的資料 又以爲 應該是在地址欄直接輸地址進去的spring
但是這樣新的問題就來了 登陸第二個系統的時候 如何知道第一個系統已經登陸了 靠什麼傳輸一個標誌apache
這個問題 我到目前爲止想到 兩種解決方案瀏覽器
1. 使用response的sendredirect的方法tomcat
使用這個方法 服務器端接收的方式必定是get 並且這個方法 不能帶太多的參數服務器
這個方法的妙處就在於 使用這個方法後 是瀏覽器本身從新再次發送了一次請求cookie
這不是重點 重點是:session
若是以前有發過請求,那麼再次發送的時候 瀏覽器會本身把cookie帶上 對的這種實現單點登陸的核心就是這個方法 間接 的利用瀏覽器 保存會話的標誌從而實現單點登陸ssh
可是這樣的作的問題就是token
若是瀏覽器你的數據被你清除過,那麼 這種方法 就不奏效了 不過鑑於這種狀況應該不會發生 瀏覽器清除數據 通常都是退出後 沒有人會在使用的時候刪掉的。
-******
這裏我還想補充一點 :網上還有一種解決思路 就是域名保持一致 可是這樣會由於語言不一樣 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密碼什麼的 比較複雜 我以前弄過 不過成了通常
對於問題的話仍是要先搞清楚怎麼作 怎麼解決纔是最好的