java - 使用SSO时如何处理Http session 超时

标签 java spring session redirect spring-security-oauth2

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

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

  • 用户访问BC URL时,他会被重定向到A登录页面进行身份验证。登录后,他会被重定向回 BC 应用程序。

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

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

我的问题如下。我们以用户想要连接到B应用程序的情况为例,一旦他被重定向到A应用程序,他就不会登录。 一段时间后, session 超时, session 被销毁,因此当他登录时,他不会重定向到 B 应用程序,而是重定向到 A 应用程序上的帐户。

可能的解决方案:

  • 显而易见的方法是禁用 HttpSession 的超时:

    <session-config> <session-timeout>-1</session-timeout> </session-config>

    这不是一个好主意,因为它存在安全风险,并且可能导致身份验证服务器过载。

  • 我添加了 HttpSessionDestroyedEvent ApplicationListener为了检测超时并存储 session 的请求而被销毁。主要思想是在用户超时后连接后重定向用户。因此,在成功连接后,我检查 AuthenticationSuccessHandler 中的请求缓存。查看是否存储了请求并重定向用户。

    if (timeOutHandler.isTimeOut()) {
        redirectStrategy.sendRedirect(request, response, 
        timeOutHandler.getRequest().getRedirectUrl());
        timeOutHandler.clearSession();
        return;
     }
    

    这种方法的问题是我之前不了解导致超时的用户,我最终可能会遇到这样的情况:

    • 来自 B 应用程序的用户导致超时。
    • 重定向到 B 的请求已存储。
    • 来自 C 应用程序的另一个用户也会导致超时。
    • 重定向至 B 的请求将被重定向至 重定向到C
    • 第一个用户尝试连接,他将被重定向到应用程序C

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

感谢您的帮助。

最佳答案

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

关于java - 使用SSO时如何处理Http session 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44409713/

相关文章:

java.sql.时间 : insert current time correctly

spring - 在哪里可以找到输出? Spring + H2 教程

ruby-on-rails - session cookie 不只在生产中创建

java - 同一 session 中的不同用户限制

java - 关于选择 Android 应用程序和 mysql 数据库的托管站点的建议

java - Android studio,这不是从共享首选项中检索字符串并将其转换为 hashset<string> 的正确方法吗?

java - 克隆 Java 对象

java - 如何通过注释在 Groovy 脚本中提供私有(private)字段

java - Spring Web 应用程序上的 Hibernate 集成

Go 的 session 中间件?