SAML Http请求拦截与Spring Boot

参考此SO问题使用Spring Security SAML向SAML请求添加请求参数

我想用我自己的默认HTTPRedirectDeflateBinding bean替换默认的HTTPRedirectDeflateBinding bean,它有一个自定义HTTPRedirectDeflateEncoder来向我的SAML请求添加查询参数。

我正在尝试使用Spring Boot @Bean自动配置注释实现这一点,并且是Java环境的新手,我似乎无法使其正常工作。 我可以看到我的bean在启动时正在注册,但是出站的HTTP请求没有被它拦截,看起来原来的redirectBinding仍然是。

这是我添加到Configuration类中的bean:

@Bean(name="redirectBinding") @Primary public HTTPRedirectDeflateBinding HTTPRedirectDeflateBinding() { return new HTTPRedirectDeflateBinding(null, new My_SAML_HttpRedirectDeflateEncoder()); } 

这是我的编码器我试图传递到重定向绑定

 public class My_SAML_HttpRedirectDeflateEncoder extends HTTPRedirectDeflateEncoder{ @Override protected String buildRedirectURL(SAMLMessageContext messagesContext, String endpointURL, String message) throws MessageEncodingException { URLBuilder urlBuilder = new URLBuilder(endpointURL); List<Pair> queryParams = urlBuilder.getQueryParams(); if (messagesContext.getOutboundSAMLMessage() instanceof RequestAbstractType) { queryParams.add(new Pair("service", "myService")); queryParams.add(new Pair("serviceType", "dev")); } return urlBuilder.buildURL(); } 

}

我还试图从这个SO响应spring boot中提出的解决方案添加http请求拦截器类似的结果,我的HandlerInterceptor bean被注册但没有被截获。 我觉得我错过了一个小细节。 任何帮助,将不胜感激。

您可以重新声明SAMLProcessor使用的SAMLProcessingFilter bean,并在其绑定列表中添加您自己的绑定bean。 这是一个例子,我在我的项目中使用过。

 @Bean public SAMLProcessorImpl processor() { Collection bindings = new ArrayList<>(); bindings.add(httpRedirectDeflateBinding()); bindings.add(httpPostBinding()); bindings.add(artifactBinding(parserPool(), velocityEngine())); bindings.add(httpSOAP11Binding()); bindings.add(httpPAOS11Binding()); return new SAMLProcessorImpl(bindings); } 

希望对你有效。

1.我认为你需要使用super方法buildRedirectURL,然后添加stripped或你的自定义查询参数,如下所示:

 @Override protected String buildRedirectURL(SAMLMessageContext messagesContext, String endpointURL, String message) throws MessageEncodingException { URLBuilder redirectUrlBuilder = new URLBuilder(super.buildRedirectURL(messagesContext, endpointURL, message)); List> queryParams = redirectUrlBuilder.getQueryParams(); queryParams.addAll(new URLBuilder(endpointURL).getQueryParams());// add stripped query params return redirectUrlBuilder.buildURL(); } 

2.我不确定将null作为解码器传递给HTTPRedirectDeflateBinding是否合适。 替代方案建议使用默认解码器,它接受ParserPool。