【问题标题】:Apache cxf java client + ntlm authentication and multi user supportApache cxf java 客户端 + ntlm 身份验证和多用户支持
【发布时间】:2014-04-16 03:26:23
【问题描述】:

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

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

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

任何帮助将不胜感激。

【问题讨论】:

    标签: apache authentication cxf ntlm


    【解决方案1】:

    这是 NTLM 特有的问题。 sun.net.www.protocol.https.HttpsURLConnectionImpl 正在通过 java.net.Authenticator. requestPasswordAuthentication() 获得服务器授权。此授权信息保存在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/

    【讨论】:

      【解决方案2】:

      我用谷歌搜索并尝试了很多解决这个问题的方法.. 显然最简单的代码如下使用 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) 的有效方法。请参考bughttps://issues.apache.org/jira/browse/CXF-5671


      顺便说一句,如果你有一个简单的消息需要传输,只需使用 HTTP 客户端(我使用 4.3.4.. 不确定早期版本)和 NTCredentials 实例。这对我来说也很神奇。示例如下:

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

      【讨论】:

        猜你喜欢
        • 2016-11-03
        • 1970-01-01
        • 1970-01-01
        • 2014-08-21
        • 2022-10-13
        • 2014-10-15
        • 2011-08-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多