刷新客户端Web应用程序后,Spring SSO始终创建新会话

时间:2018-05-15 01:02:27

标签: spring-boot oauth-2.0

我创建了自己的oauth2服务器,为Google和Facebook启用了SSO。我发现这个例子https://github.com/spring-guides/tut-spring-boot-oauth2非常有用,我可以通过几次调整后使我的oauth2服务器可扩展。

对于会话存储,我使用了redis,一切似乎都在使用spring magics。

但是在实现注销时遇到了会话问题。根据最佳实践的单点登录,当用户从一个客户端注销时,来自auth服务器的具有相同会话的所有其他客户端也应该被注销。所以我为每个客户端添加了一个端点,在成功登录时调用,根据来自auth服务器的用户会话注册它的名称。但是我注意到每次刷新客户端Web应用程序上的页面时,我都会从auth服务器获得一个新会话。因此,每当我尝试注销时,与所有已注册客户端关联的会话将始终成为旧客户端。

我一直在网上寻找解决方案,但还没有运气。如果有人能帮我解决这个问题,我将不胜感激。

TL; DR版本:

我使用Spring Boot实现了一个为Facebook启用了SSO的oauth2服务器。用我的Facebook帐户成功登录后,我可以看到我的客户端Web应用程序资源。每次刷新页面时,我都会看到从oauth2服务器创建一个新会话,它会存储在redis存储中,所有旧会话也会保存在存储中。

更新

每次刷新页面时,似乎所有新会话都是由匿名用户生成的。

1 个答案:

答案 0 :(得分:0)

根据这篇文档https://docs.spring.io/spring-security/site/docs/current/reference/html/anonymous.html,经过一番挖掘后发现,Spring Boot的匿名用户与未经身份验证的用户差别不大。

每次刷新页面都会生成新会话是有道理的。我的问题是,在成功进行用户身份验证时注册客户端应用程序时,我没有使用正确的会话ID。因此,我覆盖“SavedRequestAwareAuthenticationSuccessHandler.java”文件,以便我可以从请求参数获取client_id,然后将从Authentication对象获取的正确会话ID注册到此客户端ID。