【问题标题】:How to create NTLM Authentication Using spring如何使用 spring 创建 NTLM 身份验证
【发布时间】:2021-12-22 22:10:13
【问题描述】:

我正在为我的服务使用 NTLM 身份验证。如何在我的 API 服务调用中创建 NTLM 身份验证有人可以帮忙吗?我需要 NTLM 身份验证的完整编码

【问题讨论】:

标签: java spring spring-boot coding-style ntlm-authentication


【解决方案1】:

我们使用以下代码在生产中使用 NTLM。如您所见,它通过发送简单的 HTTP GET 来检查配置是否正确。

package xxx;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpRequestInterceptor;
import org.apache.http.auth.*;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.AuthSchemes;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.impl.auth.NTLMSchemeFactory;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import org.springframework.ws.transport.WebServiceMessageSender;
import org.springframework.ws.transport.http.HttpComponentsMessageSender;
import java.util.Arrays;

@Configuration
public class Configuration {
    @Bean
    public WebServiceMessageSender messageSender(
        @Autowired final Credentials credentials,
        @Autowired final HttpUriRequest handshake,
        @Value("${service.timeout}") final int timeout
    ) {
        HttpComponentsMessageSender messageSender = new HttpComponentsMessageSender();

        CredentialsProvider credentialsProvider;
        Registry<AuthSchemeProvider> registry;
        RequestConfig requestConfig;

        credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY, credentials);

        registry = RegistryBuilder.<AuthSchemeProvider> create()
                .register(AuthSchemes.NTLM, new NTLMSchemeFactory())
                .build();

        HttpRequestInterceptor interceptor =
            (request, context) -> request.removeHeaders(HttpHeaders.CONTENT_LENGTH);

        requestConfig = RequestConfig.custom()
                .setConnectTimeout(timeout)
                .build();

        CloseableHttpClient httpClient = HttpClients.custom()
                .setDefaultRequestConfig(requestConfig)
                .setDefaultAuthSchemeRegistry(registry)
                .setDefaultCredentialsProvider(credentialsProvider)
                .addInterceptorFirst(interceptor)
                .build();

        try {
            CloseableHttpResponse r = httpClient.execute(handshake);
            if (log.isInfoEnabled()) {
                log.info("Handshake initiated, response headers: {}",
                    Arrays.toString(r.getAllHeaders())
                );
            }
        } catch (Exception e) {
            log.error("Could not execute HTTP handshake request (method = {})",
                handshake.getMethod(), e
            );
        }

        messageSender.setHttpClient(httpClient);
        return messageSender;
    }

    @Bean
    public Credentials credentials(
        @Value("${service.auth.username}") String user,
        @Value("${service.auth.password}") String pass,
        @Value("${service.auth.workstation}") String workstation,
        @Value("${service.auth.domain}") String domain
    ) {
        return new org.apache.http.auth.NTCredentials(user, pass, workstation, domain);
    }

    @Bean
    public HttpUriRequest handshake(@Value("${service.uri}") final String uri) {
        return new HttpGet(uri);
    }
}

application.properties 如下所示:

service.uri=http://somehost/somepath/SomeService.svc
service.action=http://somehost1/somepath1
service.timeout=3000
service.auth.username=someuser
service.auth.password=somepassword
service.auth.domain=somedomain
service.auth.workstation=anything

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-29
    • 2019-07-22
    • 2018-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多