2014-10-28 14 views
5

Ho un'applicazione java che interagisce con un servizio SOAP. Ho usato WSDL per generare un client java tramite CXF, ma ho bisogno di autenticare le mie chiamate usando ws-security. Sto cercando un modo solo codice per farlo, e non ho alcuna configurazione xml. Questo è quello che ho provato:Nome utente WS-SecurityToken con Apache CXF

Map ctx = ((BindingProvider)port).getRequestContext(); 
ctx.put("ws-security.username", "joe"); 
ctx.put("ws-security.password", "joespassword"); 
port.makeSoapCall(); 

Ma ottengo un errore di analisi per la valida intestazione WS-Security. Qual è il modo giusto per farlo?

In SOAP UI, posso farlo facilmente cliccando col tasto destro sull'intestazione di sapone, facendo clic su "Aggiungi WSS UsernameToken", e selezionando "Password testo"

risposta

4

Si sta utilizzando WS-SecurityPolicy secondo il codice che è stato condiviso. Che ne dici di utilizzare WS-Security e di inviarlo attraverso l'usernametoken usando WSS4JOutInterceptor?

controllare la sezione "Aggiungendo le intercettori tramite l'API" in apache CFX guida WS-Security qui: http://cxf.apache.org/docs/ws-security.html

Questo è ciò che deve essere fatto secondo la sopra documenation Apache CXF sopra. Potrebbe essere necessario solo il percorso dell'intercettore.

Sul lato client, è possibile ottenere un riferimento al punto finale CXF utilizzando l'helper Clientproxy:

import org.apache.cxf.frontend.ClientProxy; 
... 

GreeterService gs = new GreeterService(); 
Greeter greeter = gs.getGreeterPort(); 
... 
org.apache.cxf.endpoint.Client client = ClientProxy.getClient(greeter); 
org.apache.cxf.endpoint.Endpoint cxfEndpoint = client.getEndpoint(); 

Ora sei pronto per aggiungere gli intercettori:

import org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor; 
import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor; 
... 

Map<String,Object> inProps = new HashMap<String,Object>(); 
... // how to configure the properties is outlined below; 

WSS4JInInterceptor wssIn = new WSS4JInInterceptor(inProps); 
cxfEndpoint.getInInterceptors().add(wssIn); 

Map<String,Object> outProps = new HashMap<String,Object>(); 
outProps.put("action", "UsernameToken Timestamp"); 
outProps.put("passwordType", "PasswordDigest"); //remove this line if want to use plain text password 
outProps.put("user", "abcd"); 
outProps.put("passwordCallbackClass", "demo.wssec.client.UTPasswordCallback"); 

WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(outProps); 
cxfEndpoint.getOutInterceptors().add(wssOut); 

Nell'esempio sopra riportato è necessario scrivere la classe di richiamata della password (UTPasswordCallback).

Apache CXF è un campione completo per UserName gettone qui: http://svn.apache.org/repos/asf/cxf/trunk/distribution/src/main/release/samples/ws_security/ut/

dal link qui sopra Sfoglia per cartella del client (src/main/java/demo/wssec/client) per il nome utente e codice token UTPasswordCallback.

MODIFICA: Se il tuo wsdl si aspetta password come testo semplice, basta rimuovere questa riga dal codice: outProps.put ("passwordType", "PasswordDigest");