Apache cxf java客户端+ ntlm身份验证和多用户支持

时间:2014-04-16 03:26:23

标签: apache authentication cxf ntlm

我正在使用apache cxf java客户端来连接我的WS。我也在使用NTLM进行身份验证。

由于凭证缓存,我现在面临的问题。我第一次尝试没有访问WS方法权限的用户。当我更改用户时,它仍然使用相同的用户来访问WS方法。

我在tomcat中运行,所以无法杀死我的JVM ..在httpClientPolicy上尝试了所有可能的组合。

任何帮助将不胜感激。

2 个答案:

答案 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();