JCIFS 可以与 Jersey 一起使用吗?

问题描述 投票:0回答:2

我在将 NTLM 身份验证添加到使用 Jersey 和 Apache HttpClient 的现有应用程序时遇到问题。我只能使用 JCIFS 进行身份验证,HttpClient 的默认 NTLM 身份验证不起作用(我明白了

401
)。

Apache HttpClient 页面的示例展示了如何使用 CloseableHttpClient: https://hc.apache.org/httpcomponents-client-4.5.x/ntlm.html

Registry<AuthSchemeProvider> authSchemeRegistry = RegistryBuilder.<AuthSchemeProvider>create()
    .register(AuthSchemes.NTLM, new JCIFSNTLMSchemeFactory())
    .register(AuthSchemes.BASIC, new BasicSchemeFactory())
    .register(AuthSchemes.DIGEST, new DigestSchemeFactory())
    .register(AuthSchemes.SPNEGO, new SPNegoSchemeFactory())
    .register(AuthSchemes.KERBEROS, new KerberosSchemeFactory())
    .build();
CloseableHttpClient httpClient = HttpClients.custom()
    .setDefaultAuthSchemeRegistry(authSchemeRegistry)
    .build();

但是使用 CloseableHttpClient 我无法使用像

target
:

这样的方法
WebTarget target = client.target(this.my Address).path(elementPath)
            .resolveTemplate(P_ID, myId);

只有

execute

我不确定是否应该重写整个应用程序并仅使用基本的 HttpClient 调用,例如:

HttpGet httpGet = new HttpGet(repositoryAddress + "/" + "element/70032_1498404600000(,,arm)");
CloseableHttpResponse response = httpClient.execute(httpGet);

或者还有其他方法可以在

javax.ws.rs.client.Client
中设置 AuthSchemes,可以在 Jersey 中使用吗?

java jersey apache-httpclient-4.x ntlm jcifs
2个回答
3
投票

我遇到了类似的问题,我的方法如下:

1)如果您使用 ApacheConnectorProvider 作为连接器,您可以覆盖 ApacheConnector 代码(在此处找到 https://github.com/jersey/jersey/tree/master/connectors/apache-connector/src/main/java/org/glassfish /jersey/apache/connector)。就我而言,我必须创建自定义 ConnectorProvider 和 Connector。

2) 创建自定义属性或使用 HttpClientContext.AUTHSCHEME_REGISTRY 并将其放入 ClientConfig 中(这是我们在 Jersey Client 中为客户端设置属性的方式)。

3)当您调用 builder.get(或 post 或任何其他方法)时,将调用自定义连接器。在自定义连接器中,您可以检查在上述步骤中设置的属性。如果设置了,您可以像为 ClosableHttpClient 指定那样设置 DefaultAuthSchemeRegistry(ApacheConnector 在其实现中使用 ClosableHttpClient)。

这可能是一种黑客行为,但对我来说效果很好。希望这有帮助:)


0
投票

如果您使用

jersey-apache-connector
,则可以将 NTLM 与 Jersey 和 Apache HTTP 客户端结合使用。然后你可以像这样覆盖身份验证方案:

import org.apache.http.auth.AuthScope;
import org.apache.http.auth.NTCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.client.config.AuthSchemes;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.glassfish.jersey.apache.connector.ApacheClientProperties;
import org.glassfish.jersey.apache.connector.ApacheConnectorProvider;
import org.glassfish.jersey.client.ClientConfig;

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;

ClientConfig clientConfig = new ClientConfig();

// Configure NTLM authentication
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new NTCredentials(username, password, null, null));
clientConfig.property(ApacheClientProperties.CREDENTIALS_PROVIDER, credentialsProvider);
clientConfig.connectorProvider(new ApacheConnectorProvider());

// Default to NTLM authentication
RequestConfig requestConfig = RequestConfig.custom().setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM)).build();
clientConfig.property(ApacheClientProperties.REQUEST_CONFIG, requestConfig);

Client client = ClientBuilder.newClient(clientConfig);

来源:

© www.soinside.com 2019 - 2024. All rights reserved.