2017-05-04 22 views

回答

0

已經解決了我的問題 因此,目前很難做到這一點,因爲您需要爲REST Assured配置HTTPClient,但它僅支持已棄用的AbstractHttpClient。這是我的實現。但我沒有能力測試它...

import io.restassured.RestAssured; 
import org.apache.http.annotation.Contract; 
import org.apache.http.annotation.ThreadingBehavior; 
import org.apache.http.auth.AuthScheme; 
import org.apache.http.auth.AuthSchemeFactory; 
import org.apache.http.auth.AuthSchemeProvider; 
import org.apache.http.auth.AuthSchemeRegistry; 
import org.apache.http.client.CredentialsProvider; 
import org.apache.http.client.config.AuthSchemes; 
import org.apache.http.impl.auth.BasicSchemeFactory; 
import org.apache.http.impl.auth.DigestSchemeFactory; 
import org.apache.http.impl.auth.win.WindowsCredentialsProvider; 
import org.apache.http.impl.auth.win.WindowsNegotiateScheme; 
import org.apache.http.impl.client.AbstractHttpClient; 
import org.apache.http.impl.client.SystemDefaultCredentialsProvider; 
import org.apache.http.impl.client.SystemDefaultHttpClient; 
import org.apache.http.params.HttpParams; 
import org.apache.http.protocol.HttpContext; 
import org.testng.annotations.Test; 

import static io.restassured.RestAssured.given; 
import static io.restassured.config.HttpClientConfig.httpClientConfig; 
import static java.net.HttpURLConnection.HTTP_OK; 

public class WinHttpClientTest { 

    @Test 
    public void test() { 

     @Contract(threading = ThreadingBehavior.IMMUTABLE) 
     class WindowsNTLMSchemeFactory implements AuthSchemeProvider, AuthSchemeFactory { 

      private final String servicePrincipalName; 

      public WindowsNTLMSchemeFactory(final String servicePrincipalName) { 
       super(); 
       this.servicePrincipalName = servicePrincipalName; 
      } 

      @Override 
      public AuthScheme create(final HttpContext context) { 
       return new WindowsNegotiateScheme(AuthSchemes.NTLM, servicePrincipalName); 
      } 

      @Override 
      public AuthScheme newInstance(HttpParams params) { 
       return new WindowsNegotiateScheme(AuthSchemes.NTLM, null) ; 
      } 
     } 

     @Contract(threading = ThreadingBehavior.IMMUTABLE) 
     class WindowsNegotiateSchemeFactory implements AuthSchemeProvider, AuthSchemeFactory { 

      private final String servicePrincipalName; 

      public WindowsNegotiateSchemeFactory(final String servicePrincipalName) { 
       super(); 
       this.servicePrincipalName = servicePrincipalName; 
      } 

      @Override 
      public AuthScheme create(final HttpContext context) { 
       return new WindowsNegotiateScheme(AuthSchemes.SPNEGO, servicePrincipalName); 
      } 

      @Override 
      public AuthScheme newInstance(HttpParams params) { 
       return new WindowsNegotiateScheme(AuthSchemes.SPNEGO, null); 
      } 
     } 

     AuthSchemeRegistry authSceme = new AuthSchemeRegistry(); 
     authSceme.register(AuthSchemes.BASIC, new BasicSchemeFactory()); 
     authSceme.register(AuthSchemes.DIGEST, new DigestSchemeFactory()); 
     authSceme.register(AuthSchemes.NTLM, new WindowsNTLMSchemeFactory(null)); 
     authSceme.register(AuthSchemes.SPNEGO, new WindowsNegotiateSchemeFactory(null)); 

     final CredentialsProvider credsProvider = new WindowsCredentialsProvider(new SystemDefaultCredentialsProvider()); 
     AbstractHttpClient httpClient = new SystemDefaultHttpClient(); 
     httpClient.setAuthSchemes(authSceme); 
     httpClient.setCredentialsProvider(credsProvider); 

     RestAssured.config = RestAssured.config().httpClient(httpClientConfig().httpClientFactory(() -> httpClient)); 
     given() 
       .log().all() 
       .when() 
       .get("http://httpbin.org/get") 
       .then() 
       .log().all() 
       .statusCode(HTTP_OK); 
    } 

} 
+0

這與認證無關。答案只會在標題中設置信息。 – Piazzolla

+0

@Piazzolla的問題是:如何將Windows用戶登錄到API請求頭?你想要什麼? – RocketRaccoon

+0

是的,這是問題的最後一部分,但至少標題和問題包括「Windows身份驗證」以及有關哪個用戶的信息不是僅用於身份驗證的信息。我可以看到,我的答案可能會有點困難。 – Piazzolla

相關問題