参考此SO问题Add request parameter to SAML request using Spring Security 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<String, String>> queryParams = urlBuilder.getQueryParams();
if (messagesContext.getOutboundSAMLMessage() instanceof RequestAbstractType) {
queryParams.add(new Pair<String, String>("service", "myService"));
queryParams.add(new Pair<String, String>("serviceType", "dev"));
}
return urlBuilder.buildURL();
}
}
我还试图通过此SO响应提出解决方案spring boot adding http request interceptors 类似的结果,我的HandlerInterceptor bean被注册但没有被截获。我觉得我错过了一个小细节。任何帮助,将不胜感激。
答案 0 :(得分:0)
您可以重新声明由SAMLProcessor
使用的SAMLProcessingFilter
bean - 并在其绑定列表中添加您自己的绑定bean。这是我在我的项目中使用的一个例子。
@Bean
public SAMLProcessorImpl processor() {
Collection<SAMLBinding> 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 :(得分:0)
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<Pair<String, String>> queryParams = redirectUrlBuilder.getQueryParams();
queryParams.addAll(new URLBuilder(endpointURL).getQueryParams());// add stripped query params
return redirectUrlBuilder.buildURL();
}
2.我不确定将null作为解码器传递给HTTPRedirectDeflateBinding是否合适。替代方案建议使用默认解码器,它接受ParserPool。
答案 2 :(得分:0)
我知道这个问题很老,但是我一直在努力解决同样的问题。我添加答案,以防万一可以帮助其他人。
仅在使用httpRedirectDeflateBinding
绑定时才会调用GET
。在我的情况下,我们为POST
使用了WebSSOProfileOptions
绑定。我们的配置如下所示:
@Bean
WebSSOProfileOptions defaultWebSSOProfileOptions() {
WebSSOProfileOptions webSSOProfileOptions = new WebSSOProfileOptions();
webSSOProfileOptions.setIncludeScoping(false);
webSSOProfileOptions.setAllowCreate(true);
webSSOProfileOptions.setNameID("");
webSSOProfileOptions.setForceAuthN(true);
//This line is for enabling POST request
webSSOProfileOptions.setBinding("urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST");
return webSSOProfileOptions;
}
在这种情况下,自定义替代应适用于HTTPPostEncoder
。将自定义类插入HTTPPostBinding
,自定义逻辑将被执行。