我有一个 Spring 应用程序(我们将其称为A,表示身份验证)用作身份验证服务器。 A 正在为另外两个应用程序启用SSO(B 用于业务,C 用于客户端)。
SSO 身份验证是通过重定向完成的:
- 用户访问B或C URL时,他会被重定向到A登录页面进行身份验证。登录后,他会被重定向回 B 或 C 应用程序。
使用 org.springframework.security.web.savedrequest.SavedRequest
中的 redirectUrl 参数完成重定向。 .
因此,用户可以来自 B 或 C 应用程序,也可以直接登录到 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/