WSO2 Identity Server与Spring SAML无状态集成方案咨询
无状态Spring SAML + WSO2 Identity Server 5.11.0集成实现方案
核心思路是关闭Spring Security默认的服务端会话存储逻辑,将认证信息通过自包含的客户端凭证存储,全程不依赖服务端会话:
1. 关闭Spring Security默认会话管理
首先修改Spring Security配置,将会话创建策略设置为STATELESS,彻底禁用JSESSIONID的生成和消费:
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() // 其余原有SAML、权限相关配置保留 } }
注意:该配置生效后所有依赖服务端会话的逻辑都会失效,需要配套客户端凭证逻辑完成认证校验
2. 改造SAML认证成功处理逻辑
默认的SAML认证成功处理器会将认证信息绑定到服务端会话,现在需要替换为自定义逻辑:
- 完成SAML断言校验后(必须校验断言签名、有效期、签发方为你的WSO2 IS 5.11.0实例),提取断言中的用户属性、权限、有效期等信息
- 将上述信息加密签名生成自包含的JWT/客户端token,返回给客户端存储(可以存在HttpOnly Cookie或者请求头携带的存储介质中)
WSO2 IS 5.11.0默认返回的SAML断言已经包含配置好的用户属性,不需要额外调用接口查询用户信息
3. 新增客户端token校验过滤器
在Spring Security过滤器链的SAML过滤器之前,新增自定义token校验过滤器:
- 每次请求时从请求头/Cookie中提取客户端携带的token
- 校验token的签名、有效期,校验通过后直接把对应的认证信息组装后存入
SecurityContextHolder,全程不需要查询服务端会话
4. 关闭SAML模块依赖会话的逻辑
因为没有服务端会话,需要调整SAML的配套逻辑:
- 禁用SAML的
RelayState服务端会话存储,可将RelayState签名后交给前端存储,回调时带回即可 - 替换SAML断言重放检测逻辑:如果需要做重放防护,可以用分布式缓存存储断言ID和有效期,不要绑定到用户会话
注意事项
- 如果使用Spring Security 5.4+版本的官方SAML2模块,已经提供无状态场景的扩展点,不需要完全重写核心过滤器
- 客户端token必须使用强签名算法,有效期不要设置过长,降低凭证泄露风险
- WSO2 IS侧不需要额外调整配置,仅需保证SAML断言的签发方、受众、签名证书和SP侧配置一致即可
内容的提问来源于stack exchange,提问作者ashok
相关产品推荐
相关产品推荐

