呼叫的NTLMv2通过Apache的骆驼安全端点
问题描述:
我使用Apache的骆驼2.19,我能够调用使用骆驼HTTP模块我的终点,它支持NTLMv1身份开箱时要使用NTLMv1身份:呼叫的NTLMv2通过Apache的骆驼安全端点
from("activemq:{{queue.feedback}}")
.to("http://localhost:8888/ntlm/secured?authMethodPriority=NTLM
&authMethod=NTLM&authUsername=Zaphod
&authPassword=Beeblebrox&authDomain=Minor
&authHost=LightCity")
的问题是我无法弄清楚如何使用NTLMv2进行请求。 的official documentation指出:
注:HTTP的骆驼是基于HttpClient的3.x版,因此只有 什么被称为NTLMv1身份,在 NTLM协议的早期版本的支持有限。它根本不支持NTLMv2。 camel-http4有 支持NTLMv2。
当我尝试使用骆驼http4它根本不值一提:
from("activemq:{{queue.feedback}}")
.to("http4://localhost:8888/ntlm/secured?authMethodPriority=NTLM
&authMethod=NTLM&authUsername=Zaphod
&authPassword=Beeblebrox&authDomain=Minor
&authHost=LightCity")
看来,骆驼http4不知道NTLM都没有。我试图调查camel-http4 repo on GitHub,除了文档之外,我找不到与NTLM相关的任何内容。
任何有关如何在Camel 2.19中使用NTLMv2的想法(骆驼的其他版本可能也很适合)?
答
问题出在camel-http4组件上。默认情况下,它使用InputStreamEntity,它不是HttpEntity实体的可重复实现,这意味着一旦读取了流 - 它已关闭,并且无法再读取它。这导致MainClientExec失败:
if (execCount > 1 && !RequestEntityProxy.isRepeatable(request)) {
throw new NonRepeatableRequestException("Cannot retry request with a non-repeatable request entity.");
}
这似乎是一个错误,因此解决办法是InputStreamEntity转换为ByteArrayEntity(这是重复的)是在发送请求之前:
@Component
public class NtlmProcessor implements Processor {
@Override
public void process(Exchange exchange) throws Exception {
HttpEntity httpEntity = exchange.getIn().getBody(HttpEntity.class);
byte[] bytes = EntityUtils.toByteArray(httpEntity);
ByteArrayEntity byteArrayEntity = new ByteArrayEntity(bytes, ContentType.get(httpEntity));
exchange.getOut().setBody(byteArrayEntity);
}
}