Java 在防止会话固定时,如何在成功进行身份验证后强制更新身份验证对象中的会话id?

Java 在防止会话固定时,如何在成功进行身份验证后强制更新身份验证对象中的会话id?,java,authentication,spring-security,Java,Authentication,Spring Security,我需要使用成功身份验证后生成的新会话id记录用户登录和注销事件,以防止会话固定。我注意到身份验证对象的Details对象中的sessionId值在创建新会话后没有得到更新。在过去的两天里,我阅读了很多javadoc,并在网上搜索答案。我找到了卢克·泰勒。我尝试了他的建议,但似乎不起作用,所以我尝试创建一个CustomWebAuthenticationDetails,允许我将sessionId设置为新值(我无法扩展WebAuthenticationDetails,因为实例变量sessionId是f

我需要使用成功身份验证后生成的新会话id记录用户登录和注销事件,以防止会话固定。我注意到身份验证对象的Details对象中的sessionId值在创建新会话后没有得到更新。在过去的两天里,我阅读了很多javadoc,并在网上搜索答案。我找到了卢克·泰勒。我尝试了他的建议,但似乎不起作用,所以我尝试创建一个CustomWebAuthenticationDetails,允许我将sessionId设置为新值(我无法扩展WebAuthenticationDetails,因为实例变量sessionId是final)然后使用CustomSessionAuthenticationStrategy扩展SessionFixationProtectionStrategy并覆盖SessionChange方法。在这个方法中,我使用包含新sessionId的CustomWebAuthenticationDetails实例更新了Authentication对象中的Details对象。这似乎是可行的,但一旦我注销并重新登录,我得到了一个java.lang.ClassCastException:org.springframework.security.web.authentication.WebAuthenticationDetails无法转换为org…CustomWebAuthenticationDetails。我理解为什么会出现异常,所以在搜索了更多内容后,我尝试创建一个CustomWebAuthenticationDetailsSource并将其注入到UsernamePasswordAuthenticationFilter的实例中,但出现了一个错误,即“必须指定authenticationManager”。当我尝试同时注入AuthenticationManager时,我意识到我不能,因为我在应用程序中使用了RemoteAuthenticationManager。在这一点上,我不知道还有什么可以尝试,所以任何建议都将不胜感激

我还想知道为什么在创建新会话以防止会话固定后,身份验证对象中的sessionId没有更新。这样做会降低应用程序的安全性吗?如果是,怎么做

谢谢