2017-06-07 52 views
0

時處理的Http會話超時有Spring應用程序(姑且稱之爲一個認證)作爲認證服務器。 A正在啓用SSO用於其他兩個應用程序(B for Business和C for Client)。我如何使用SSO

SSO的認證是通過重定向完成:

  • 用戶轉到Ç URL,他被重定向到用於認證的登錄頁面。登錄後,他被重定向回BC應用程序。

重定向使用在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
    • 的第一個用戶試圖連接時,他會被重定向到應用Ç

那麼,你覺得會是最好的辦法,或者你有更好的解決辦法?

謝謝你的幫助。

回答

0

如果可以幫助,我使用的解決方案是在登錄表單中添加一個隱藏字段並存儲重定向url,以便即使在會話超時之後也可以從後端訪問。