【发布时间】:2017-06-20 17:11:57
【问题描述】:
我有一个 Spring 应用程序(我们称它为 A 表示 Authentication)用作身份验证服务器。 A 正在为另外两个应用程序启用 SSO(B 代表企业,C 代表客户)。
SSO 身份验证通过重定向完成:
- 用户转到 B 或 C URL,他被重定向到 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>这不是一个好主意,因为它存在安全风险,并且会导致身份验证服务器过载。
-
我添加了一个
HttpSessionDestroyedEventApplicationListener 以检测超时并存储要销毁的会话的请求。主要思想是在用户超时后连接后重定向用户。因此,在连接成功后,我会检查AuthenticationSuccessHandler中的请求缓存,以查看是否存储了请求并重定向用户。if (timeOutHandler.isTimeOut()) { redirectStrategy.sendRedirect(request, response, timeOutHandler.getRequest().getRedirectUrl()); timeOutHandler.clearSession(); return; }这种方法的问题是我以前不知道导致超时的用户,我最终可能会遇到这样的情况:
- 来自 B 应用程序的用户导致超时。
- 存储重定向到B的请求。
- 另一个用户来自 C 应用程序也会导致超时。
- 重定向到 B 的请求被 重定向到 C。
- 第一个用户尝试连接,他将被重定向到应用程序 C
那么,您认为最好的方法是什么,或者您有更好的解决方案吗?
感谢您的帮助。
【问题讨论】:
标签: java spring session redirect spring-security-oauth2