如何使用spring-security-saml2-service-provider序列化SAML断言?
spring-security-saml2-service-provider序列化SAML断言响应的实现
是的,spring-security-saml2-service-provider中存在类似原spring-security-saml2-core里序列化SAML断言响应的能力,只是实现逻辑和方式有所调整:
- 获取断言对象:认证成功后,Spring Security会生成
Saml2AuthenticationToken并放入安全上下文,你可以在自定义认证成功处理器、过滤器或控制器中提取该对象,从中获取SAML断言实例。 - 序列化断言为字符串:由于spring-security-saml2-service-provider底层依赖OpenSAML库,你可以直接使用OpenSAML的XML序列化工具将断言对象转换为XML格式的字符串。
- 代码示例:
@Component public class CustomSamlSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication auth) throws IOException, ServletException { if (auth instanceof Saml2AuthenticationToken samlToken) { Assertion assertion = samlToken.getAssertion(); // 利用OpenSAML的Marshaller完成序列化 XMLObjectMarshaller marshaller = Configuration.getMarshallerFactory().getMarshaller(assertion); StringWriter writer = new StringWriter(); marshaller.marshall(assertion, new StreamResult(writer)); String serializedAssertion = writer.toString(); // 将序列化后的断言返回给Angular SPA(注意转义XML中的引号) response.setContentType("application/json"); response.getWriter().write("{\"samlAssertion\": \"" + serializedAssertion.replace("\"", "\\\"") + "\"}"); return; } super.onAuthenticationSuccess(request, response, auth); } }
- 配置要点:需要将自定义的成功处理器配置到SAML2认证流程中,比如通过
Saml2LoginConfigurer的successHandler方法指定。
内容的提问来源于stack exchange,提问作者george
相关产品推荐
相关产品推荐

