NTLM Webservice Authentisierung in JBoss 7.1

Allgemein

Im JBoss 7.1 sind Teile des Apache CXF Frameworks integriert, primär für die Unterstützung der WS-Policy Attribute. Standard JAX-WS Elemente werde von JBossWS unterstützt.

Erstellen Webservice Client Verbindung

Die Webservice Interface Klassen werden mittels wsconsume.sh im $JBOSS_BOME/bin Verzeichnisses erstellt.

Die von wsconsume erstelle WebserviceClient Klasse kann mittels Konstruktur auf die effektive URL verwiesen werden:

service = new AWebserviceClient(new URL(m_serviceUrl));
AServiceEndpoint endpoint = service.getServiceEndpointA();

der ServiceEndpoint implementiert danach die aufrufbare Webservice Methoden:

int result = endpoint.aWebserviceMethod(param1, param2);

NTLM Authentisierung

Java unterstützt seit JDK 1.5 (aktuell 1.7) NTLM, seit 1.6 NTLMv2 Authentisierung.

Die Logininformationen für den Webservice werden via Authenticator mitgeteilt:

Authenticator.setDefault(new Authenticator() {
   @Override
   protected PasswordAuthentication getPasswordAuthentication() {
      return new PasswordAuthentication(m_serviceUsername, m_servicePasswort
         .toCharArray());
   }
});

Dies geschieht vor dem Erstellen der Webservice Referenz.

HTML Chunking

Das Problem der NTLM Authentisierung liegt darin, dass das "HTML chunking" deaktiviert werden muss. das HTML Chunking bedeutet, dass ein Request in mehrere Abfragen unterteilt werden kann, dabei werden bei den Folgerequest anscheinend die User Credentials nicht mehr korrekt gesetzt.

Bei der JBoss-Apache CXF Integration kann das Chunking nur programmatisch nach dem Erstellen der Webservice Referenz ausgeschaltet werden, näheres Dazu steht in der Apache CXF Dokumentation:
http://cxf.apache.org/docs/client-http-transport-including-ssl-support.html#ClientHTTPTransport%28includingSSLsupport%29-Usingjavacode

Im konkreten Beispiel bedeutet dies folgendes:

AWebserviceClient service = new AWebserviceClient(new URL(m_serviceUrl)); 
AServiceEndpoint endpoint = service.getServiceEndpointA();
Client client = ClientProxy.getClient(endpoint);
HTTPConduit http = (HTTPConduit)client.getConduit();
HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();

// turn chunking off, otherwise it won't work with NTLM Authentication
httpClientPolicy.setAllowChunking(false);
http.setClient(httpClientPolicy);

JBoss Abhängigkeiten

Damit beim Deployen auf JBoss keine ClassNotFoundException betreffend der Apache CXF Komponente auftritt muss im MANIFEST des EJB Projektes das JBoss Modul exportiert werden. Innerhalb von Maven geschieht dies mittels Definition des folgenden Plugins im build Bereich des pom.xml

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-ejb-plugin</artifactId>
   <version>2.3</version>
   <configuration>
      <ejbVersion>3.1</ejbVersion>
      <archive>
         <manifestEntries>
            <dependencies>org.apache.cxf export services</dependencies>
         </manifestEntries>
      </archive>
   </configuration>
</plugin>


That's it!