簡體   English   中英

使用 Spring Boot 攔截 SAML Http 請求

[英]SAML Http Request Intercept with Spring Boot

參考這個 SO question Add request parameter to SAML request using Spring Security SAML

我想用我自己的具有自定義 HTTPRedirectDeflateEncoder 的默認 HTTPRedirectDeflateBinding bean 替換默認的 HTTPRedirectDeflateBinding bean,以將查詢參數添加到我的 SAML 請求中。

我正在嘗試使用Spring Boot @Bean 自動配置注釋來實現這一點,並且是 Java 環境的新手,我似乎無法讓它正常工作。 我可以看到我的 bean 在啟動時注冊,但出站 HTTP 請求沒有被它攔截,看起來原始的重定向綁定仍然是。

這是我添加到 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 添加 Http 請求攔截器類似的結果,我的 HandlerInterceptor bean 已注冊但沒有被攔截。 我覺得我錯過了一個小細節。 任何幫助將不勝感激。

1.我認為您需要使用超級方法 buildRedirectURL 然后添加剝離或您的自定義查詢參數,如下所示:

@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。

我知道這個問題很老了,但我在同樣的問題上苦苦掙扎。 我正在添加答案,以防萬一它可以幫助其他人。

只有在使用GET綁定時才會調用httpRedirectDeflateBinding 在我的例子中,我們對WebSSOProfileOptions使用了POST綁定。 我們的配置如下所示:

    @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並且應該執行自定義邏輯。

您可以重新聲明SAMLProcessor bean(由SAMLProcessingFilter使用)並在其綁定列表中添加您自己的綁定 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);
}

希望它對你有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM