使用SSO时如何处理Http会话超时

时间:2017-06-07 10:11:21

标签: java spring session redirect spring-security-oauth2

我有一个 Spring应用程序(我们称之为 A 用于身份验证)用作身份验证服务器。 A 正在为其他两个应用启用 SSO B代表业务,C代表客户)。

SSO身份验证通过重定向完成:

  • 用户转到 B C 网址后,会被重定向到认证的A登录页面。登录后,他将被重定向回 B C 应用程序。

使用org.springframework.security.web.savedrequest.SavedRequest中的 redirectUrl 参数完成重定向。

因此,用户可以来自 B C 应用程序,也可以直接登录到 A 应用程序中的帐户。

我的问题如下。我们假设用户想要连接到 B 应用程序,一旦将其重定向到 A 应用程序,他就不会登录。 一段时间后会发生会话超时,并且会话被销毁,因此当他登录时,他不会被重定向到 B 应用程序,而是被重定向到 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 应用程序,会导致超时。
    • 存储重定向到 B 的请求。
    • 另一位来自 C 应用程序的用户也会导致超时。
    • 重定向到 B 的请求会被请求覆盖 重定向到 C
    • 第一个用户尝试连接,他将重定向到应用 C

那么,您认为最好的方法是什么,或者您有更好的解决方案?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

如果它有帮助,我使用的解决方案是在登录表单中添加一个隐藏字段并存储重定向URL,因此即使在会话超时后也可以从后端访问它。

相关问题