我有一个 Spring应用程序(我们称之为 A 用于身份验证)用作身份验证服务器。 A 正在为其他两个应用启用 SSO ( B代表业务,C代表客户)。
SSO身份验证通过重定向完成:
使用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;
}
这种方法的问题在于,我之前并不知道导致超时的用户,我最终会遇到这样的情况:
那么,您认为最好的方法是什么,或者您有更好的解决方案?
感谢您的帮助。
答案 0 :(得分:0)
如果它有帮助,我使用的解决方案是在登录表单中添加一个隐藏字段并存储重定向URL,因此即使在会话超时后也可以从后端访问它。