我正在使用apache cxf java客户端来连接我的WS。我也在使用NTLM进行身份验证。
由于凭证缓存,我现在面临的问题。我第一次尝试没有访问WS方法权限的用户。当我更改用户时,它仍然使用相同的用户来访问WS方法。
我在tomcat中运行,所以无法杀死我的JVM ..在httpClientPolicy上尝试了所有可能的组合。
任何帮助将不胜感激。
答案 0 :(得分:1)
这是NTLM的具体问题。 sun.net.www.protocol.https.HttpsURLConnectionImpl
正在通过java.net.Authenticator. requestPasswordAuthentication()
获取serverAuthorization。此授权信息保留在sun.net.www.protocol.http.AuthCacheValue.cache
。
因此,如果我们覆盖sun.net.www.protocol.http.AuthCacheValue
,则意味着我们可以解决此问题。
AuthCacheValue.setAuthCache(new AuthCache()
{
@Override
public void remove(String arg0, AuthCacheValue arg1) { }
@Override
public void put(String arg0, AuthCacheValue arg1) { }
@Override
public AuthCacheValue get(String arg0, String arg1)
{
return null;
}
});
参考:
http://web.archiveorange.com/archive/v/ACbGtycfTs2dqbRNpy6d
http://tigrou.nl/2011/06/11/cached-credentials-in-http-basic-authentication/
答案 1 :(得分:1)
我用谷歌搜索并尝试了很多解决这个问题的方法..显然最简单的代码如下所示使用JCIFS库
//Set the jcifs properties
jcifs.Config.setProperty("jcifs.smb.client.domain", "domainname");
jcifs.Config.setProperty("jcifs.netbios.wins", "xxx.xxx.xxx.xxx");
jcifs.Config.setProperty("jcifs.smb.client.soTimeout", "300000"); // 5 minutes
jcifs.Config.setProperty("jcifs.netbios.cachePolicy", "1200"); // 20 minutes
jcifs.Config.setProperty("jcifs.smb.client.username", "username");
jcifs.Config.setProperty("jcifs.smb.client.password", "password");
//Register the jcifs URL handler to enable NTLM
jcifs.Config.registerSmbURLHandler();
显然,CXF 3.0没有使用NTCredentials实例配置HTTP客户端(4.3.x)的有效方法。请参阅错误https://issues.apache.org/jira/browse/CXF-5671
顺便说一句,如果你有一个需要传输的简单消息,只需使用NTCredentials Instance的HTTP Client(我使用的是4.3.4 ...不确定早期版本)。这也为我带来了魔力..样本如下:
final NTCredentials ntCredentials = new NTCredentials("username", "Passworrd","destination", "domain");
CredentialsProvider credsProvider = new BasicCredentialsProvider();
credsProvider.setCredentials(AuthScope.ANY, ntCredentials);
CloseableHttpClient httpclient = HttpClientBuilder.create()
.setDefaultCredentialsProvider(credsProvider)
.build();