時處理的Http會話超時有Spring應用程序(姑且稱之爲一個爲認證)作爲認證服務器。 A正在啓用SSO用於其他兩個應用程序(B for Business和C for Client)。我如何使用SSO
SSO的認證是通過重定向完成:
- 用戶轉到乙或Ç URL,他被重定向到用於認證的登錄頁面。登錄後,他被重定向回B或C應用程序。
重定向使用在org.springframework.security.web.savedrequest.SavedRequest
的的redirectUrl參數的做法。
所以,用戶可以來既可以從乙或Ç應用到來,或者直接登錄到他的帳戶上甲應用。
我的問題,如下。我們來看一個用戶想要連接到應用程序的情況,一旦他被重定向到A應用程序,他不會登錄。 過了一會發生會話超時,會話被破壞,所以當他登錄時,他是不是重定向到乙應用,而是他的一個應用帳戶。
可能的解決方案:
明顯的方法,就是在HttpSession中禁用超時:
<session-config> <session-timeout>-1</session-timeout> </session-config>
這是不是一個很好的主意,因爲它是一個安全風險,威脅超載認證服務器。
我添加了一個
HttpSessionDestroyedEvent
ApplicationListener以檢測超時並存儲要破壞的會話請求。主要想法是在超時後連接用戶時重定向用戶。因此,如果連接成功,我會檢查AuthenticationSuccessHandler
中的請求緩存,以查看請求是否存儲並重定向用戶。if (timeOutHandler.isTimeOut()) { redirectStrategy.sendRedirect(request, response, timeOutHandler.getRequest().getRedirectUrl()); timeOutHandler.clearSession(); return; }
這種方法的問題是,我的用戶沒有以前的知識誰造成超時,我可以在這樣的情況下結束了:
- 用戶來自乙應用程序,導致超時。
- 存儲重定向到B的請求。
- 另一位用戶來自C應用程序也導致超時。
- 重定向到B的請求被請求覆蓋,請求重置爲 重定向到C。
- 的第一個用戶試圖連接時,他會被重定向到應用Ç
那麼,你覺得會是最好的辦法,或者你有更好的解決辦法?
謝謝你的幫助。