我在将 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 中使用吗?
我遇到了类似的问题,我的方法如下:
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)。
这可能是一种黑客行为,但对我来说效果很好。希望这有帮助:)
如果您使用
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);
来源: