2017-07-02 5 views
0

J'ai du mal à ajouter l'authentification NTLN à mon application existante qui utilise Jersey et Apache HttpClient. Je ne pouvais authentifier en utilisant JCIFS, l'authentification NTLM par défaut de HttpClient ne fonctionne pas (j'obtiens 401).JCIFS peut-il être utilisé avec Jersey?

L'exemple de la page Apache HttpClient montre comment utiliser CloseableHttpClient: https://hc.apache.org/httpcomponents-client-4.5.x/ntlm.html

Registry<AuthSchemeProvider> authSchemeRegistry = RegistryBuilder.<AuthSchemeProvider>create() 
    .register(AuthSchemes.NTLM, new JCIFSNTLMSchemeFactory()) 
    .register(AuthSchemes.BASIC, new BasicSchemeFactory()) 
    .register(AuthSchemes.DIGEST, new DigestSchemeFactory()) 
    .register(AuthSchemes.SPNEGO, new SPNegoSchemeFactory()) 
    .register(AuthSchemes.KERBEROS, new KerberosSchemeFactory()) 
    .build(); 
CloseableHttpClient httpClient = HttpClients.custom() 
    .setDefaultAuthSchemeRegistry(authSchemeRegistry) 
    .build(); 

Mais avec CloseableHttpClient je ne peux pas utiliser des méthodes comme target:

WebTarget target = client.target(this.my Address).path(elementPath) 
      .resolveTemplate(P_ID, myId); 

Il n'y a execute.

Je ne sais pas si je devrais réécrire ma demande tout et utiliser uniquement les appels HttpClient de base comme:

HttpGet httpGet = new HttpGet(repositoryAddress + "/" + "element/70032_1498404600000(,,arm)"); 
CloseableHttpResponse response = httpClient.execute(httpGet); 

ou il y a une autre façon de mettre en AuthSchemes javax.ws.rs.client.Client, qui peut être utilisé à Jersey?

Répondre

2

je faisais face à des problèmes similaires et mon approche est ci-dessous:

1) Si vous utilisez ApacheConnectorProvider comme connecteur vous pouvez remplacer le code ApacheConnector (trouvé ici https://github.com/jersey/jersey/tree/master/connectors/apache-connector/src/main/java/org/glassfish/jersey/apache/connector). Dans mon cas, j'ai dû créer un ConnectorProvider et un Connector personnalisés.

2) Créez une propriété personnalisée ou utilisez HttpClientContext.AUTHSCHEME_REGISTRY et placez-le dans ClientConfig (C'est ainsi que nous définissons les propriétés du client dans Jersey Client).

3) Le connecteur Custom est appelé lorsque vous appelez builder.get (ou post ou toute autre méthode). Dans le connecteur personnalisé, vous pouvez vérifier la propriété définie dans l'étape ci-dessus. Si elle est définie, vous pouvez définir le DefaultAuthSchemeRegistry comme il est spécifié pour ClosableHttpClient (ApacheConnector utilise ClosableHttpClient dans son implémentation).

Cela peut être un peu un hack mais fonctionne bien pour moi. J'espère que cela aide :)