我的团队有一个 Spring Boot Web 应用程序。我们最近在我们公司向客户提供的服务中添加了 SAML 支持。我们基于 spring-security-saml 1.0.6 扩展开发了一个解决方案。
我们的一位客户进行了审查,发现浏览器 sessionId 在成功登录后没有改变。这是主要弹簧安全代码默认打开的功能,并通过 sessionManagement.sessionFixation 选项进行配置。
我已经尝试在我们的 SAML 配置中添加对它的引用,尝试了所有可能的配置选项,但它似乎根本没有任何效果。这是配置 HttpSecurity 对象的 WebSecurityConfigurationAdapter 代码的部分配置:
http
.apply(saml())
.authenticationProvider(samlAuthenticationProvider())
.userDetailsService(samlUserDetailsService)
.successHandler(authenticationSuccessHandler())
.failureHandler(new SimpleUrlAuthenticationFailureHandler("/"))
.serviceProvider()
.keyStore()
.storeFilePath(samlProperties.getKeystore())
.password(samlProperties.getKeystorePassword())
.keyname(samlProperties.getDefaultKey())
.keyPassword(samlProperties.getDefaultKeyPassword())
.and()
.sessionManagement().sessionFixation().changeSessionId()
我看过一篇文章提到需要手动配置 SAML 提供程序以使用为核心 spring 安全性定义的某些对象,但它没有专门处理 sessionFixation 配置。
在用户名/密码登录期间,我可以在日志文件中看到会话 ID 切换,其中 spring 安全模块设置为跟踪:
2020-10-07 15:47:19.282 DEBUG 41443 S:A5787647 R:d429a48d --- [nio-8081-exec-1] s.s.w.c.SecurityContextPersistenceFilter : SecurityContextHolder now cleared, as request processing completed
2020-10-07 15:47:19.294 DEBUG 41443 S:C5DA158B R:67143c30 --- [nio-8081-exec-9] o.s.security.web.FilterChainProxy : /initial-page at position 1 of 14 in additional filter chain; firing Filter: 'MetadataGeneratorFilter'
我不确定过滤器链是否被过早终止,或者 sessionFixation 过滤器是否从未在 SAML 端配置过。有谁知道我怎样才能让它工作?