使用Spring Boot进行SAML Http请求拦截

时间:2018-01-31 21:42:07

标签: java spring-mvc spring-boot spring-security saml-2.0

参考此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被注册但没有被截获。我觉得我错过了一个小细节。任何帮助,将不胜感激。

3 个答案:

答案 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,自定义逻辑将被执行。