Spring Security SAML集成Spring Session后SESSION存储消息找不到问题
问题根因
你遇到的异常由两个核心原因共同导致:
- 引入
org.springframework.session依赖后,Spring Session的自动配置优先级高于ServletContextInitializer的会话配置,覆盖了你自定义的Session Cookie名称、属性 - Spring Security默认开启的会话固定保护机制,会在用户身份认证成功后自动生成新的会话ID规避攻击,你原有会话中存储的SAML请求标识没有被迁移到新会话,导致IDP回调时无法匹配
InResponseToField
解决方案
1. 修复自定义Session Cookie配置不生效问题
替换原有ServletContextInitializer配置,直接注册CookieSerializer Bean,Spring Session会自动读取该配置,不会再覆盖自定义的Cookie属性:
import org.springframework.session.web.http.DefaultCookieSerializer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.beans.factory.annotation.Value; @Configuration public class SessionConfig { @Value("${server.servlet.session.cookie.secure:false}") private boolean secureCookie; @Bean public DefaultCookieSerializer cookieSerializer() { DefaultCookieSerializer serializer = new DefaultCookieSerializer(); // 自定义Cookie名称,不会再被覆盖 serializer.setCookieName("mujinaSpSessionId"); serializer.setUseSecureCookie(secureCookie); serializer.setUseHttpOnlyCookie(true); return serializer; } }
2. 解决会话ID变更导致SAML标识丢失问题
二选一即可:
方案A:配置会话固定保护为属性迁移模式
显式指定会话固定保护策略为migrateSession,该模式会在变更会话ID的同时,将原有会话的所有属性完整迁移到新会话中,SAML存储的请求标识也会被保留:
@Override protected void configure(HttpSecurity http) throws Exception { http // 省略你原有其他HttpSecurity配置 .sessionManagement() .sessionFixation().migrateSession(); }
方案B:针对SAML回调路径单独适配
如果你的业务场景不需要对SAML断言回调路径做会话固定防护,也可以单独调整该路径的策略(SAML默认回调路径为/saml/SSO,可根据你实际配置修改):
@Override protected void configure(HttpSecurity http) throws Exception { http // 省略你原有其他HttpSecurity配置 .sessionManagement() .sessionFixation().migrateSession() .and() .authorizeRequests() .antMatchers("/saml/SSO").permitAll(); // 省略你原有其他权限配置 }
内容的提问来源于stack exchange,提问作者ropenrom24
相关产品推荐
相关产品推荐

