The only reference to WSHandlerConstants.USER in the blog article is in the case where you're using WSS4J interceptors and not WS-SecurityPolicy. Remember just before that code block the article says to activate the section of the code depending on the method you're using--WSS4J interceptors or WS-SecurityPolicy.

Glen

On 02/03/2012 01:03 PM, COURTAULT Francois wrote:
Hello,

I don't understand because the 2 ways of coding seem feasible according the 
article at: http://www.jroller.com/gmazza/entry/cxf_usernametoken_profile

So do you mean that the client code provided in this article is wrong ?

Best Regards

-----Original Message-----
From: Colm O hEigeartaigh [mailto:[email protected]]
Sent: vendredi 3 février 2012 18:17
To: [email protected]
Subject: Re: Issue with CXF-2.5.2 regarding UsernameToken

Hi Francois,

In the code you have that works, you are (correctly) setting the username via the tag 
"ws-security.username". This is defined in the following documentation "Configuring 
the extra properties":

http://cxf.apache.org/docs/ws-securitypolicy.html

However in the code that does not work, you are setting the username via the 
tag WSHandlerConstants.USER. This is a configuration tag used by WSS4J and it 
works with CXF for the non-WS-SecurityPolicy use-case.
As you are using WS-SecurityPolicy (TransportBindingHandler), it does not work.

Colm.

On Fri, Feb 3, 2012 at 5:10 PM, COURTAULT 
Francois<[email protected]>  wrote:
Hello everybody,

For UsernameToken, in my client code I have used the following code which is:
                  Map<String, Object>  ctx = ((BindingProvider)
port).getRequestContext();
                  ctx.put("ws-security.username", "myusername");
                  ctx.put("ws-security.password", "mypassword"); It
works :)

But if I replace this one with:
            Map<String, Object>  outProps = new HashMap<String,
Object>();
            outProps.put(WSHandlerConstants.ACTION,
WSHandlerConstants.USERNAME_TOKEN);
            outProps.put(WSHandlerConstants.USER, "myusername");
            outProps.put(WSHandlerConstants.PASSWORD_TYPE,
WSConstants.PW_TEXT);
            outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS,
ClientPasswordCB.class.getName());

            WSS4JOutInterceptor wssOut = new
WSS4JOutInterceptor(outProps);

            Client client =
org.apache.cxf.frontend.ClientProxy.getClient(port);
            Endpoint cxfEndpoint = client.getEndpoint();

            cxfEndpoint.getOutInterceptors().add(wssOut);

with
public class ClientPasswordCB implements CallbackHandler {

      @Override
      public void handle(Callback[] callbacks) throws IOException,
                  UnsupportedCallbackException {
            // TODO Auto-generated method stub
            WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
            if ("myusername".equals(pc.getIdentifier())) {
                  pc.setPassword("mypassword");
            }
      }

}

I got the following error:
févr. 2012 18:04:50 org.apache.cxf.phase.PhaseInterceptorChain
doDefaultLogging
ATTENTION: Interceptor for
{http://gemalto/test/ws/}SimpleWSEJBService#{http://gemalto/test/ws/}h
elloWorld has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: No username available
      at
org.apache.cxf.ws.security.wss4j.policyhandlers.TransportBindingHandle
r.handleBinding(TransportBindingHandler.java:151)
      at
org.apache.cxf.ws.security.wss4j.PolicyBasedWSS4JOutInterceptor$Policy
BasedWSS4JOutInterceptorInternal.handleMessage(PolicyBasedWSS4JOutInte
rceptor.java:158)
      at
org.apache.cxf.ws.security.wss4j.PolicyBasedWSS4JOutInterceptor$Policy
BasedWSS4JOutInterceptorInternal.handleMessage(PolicyBasedWSS4JOutInte
rceptor.java:88)
      at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseIntercepto
rChain.java:263)
      at
org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:533)
      at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:463)
      at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:366)
      at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:319)
      at
org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:88)
      at
org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:134
)
      at $Proxy27.helloWorld(Unknown Source)
      at
com.gemalto.test.cxf.TestSimpleWSCXFClientHttpsUsername.main(TestSimpl
eWSCXFClientHttpsUsername.java:85)
Caused by: org.apache.cxf.ws.policy.PolicyException: No username
available
      at
org.apache.cxf.ws.security.wss4j.policyhandlers.AbstractBindingBuilder
.policyNotAsserted(AbstractBindingBuilder.java:301)
      at
org.apache.cxf.ws.security.wss4j.policyhandlers.AbstractBindingBuilder
.addUsernameToken(AbstractBindingBuilder.java:804)
      at
org.apache.cxf.ws.security.wss4j.policyhandlers.AbstractBindingBuilder
.handleSupportingTokens(AbstractBindingBuilder.java:475)
      at
org.apache.cxf.ws.security.wss4j.policyhandlers.AbstractBindingBuilder
.handleSupportingTokens(AbstractBindingBuilder.java:462)
      at
org.apache.cxf.ws.security.wss4j.policyhandlers.TransportBindingHandle
r.handleNonEndorsingSupportingTokens(TransportBindingHandler.java:200)
      at
org.apache.cxf.ws.security.wss4j.policyhandlers.TransportBindingHandle
r.handleBinding(TransportBindingHandler.java:144)
      ... 11 more
Exception in thread "main" javax.xml.ws.soap.SOAPFaultException: No
username available
      at
org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:156
)
      at $Proxy27.helloWorld(Unknown Source)
      at
com.gemalto.test.cxf.TestSimpleWSCXFClientHttpsUsername.main(TestSimpl
eWSCXFClientHttpsUsername.java:85)
Caused by: org.apache.cxf.ws.policy.PolicyException: No username
available
      at
org.apache.cxf.ws.security.wss4j.policyhandlers.AbstractBindingBuilder
.policyNotAsserted(AbstractBindingBuilder.java:301)
      at
org.apache.cxf.ws.security.wss4j.policyhandlers.AbstractBindingBuilder
.addUsernameToken(AbstractBindingBuilder.java:804)
      at
org.apache.cxf.ws.security.wss4j.policyhandlers.AbstractBindingBuilder
.handleSupportingTokens(AbstractBindingBuilder.java:475)
      at
org.apache.cxf.ws.security.wss4j.policyhandlers.AbstractBindingBuilder
.handleSupportingTokens(AbstractBindingBuilder.java:462)
      at
org.apache.cxf.ws.security.wss4j.policyhandlers.TransportBindingHandle
r.handleNonEndorsingSupportingTokens(TransportBindingHandler.java:200)
      at
org.apache.cxf.ws.security.wss4j.policyhandlers.TransportBindingHandle
r.handleBinding(TransportBindingHandler.java:144)
      at
org.apache.cxf.ws.security.wss4j.PolicyBasedWSS4JOutInterceptor$Policy
BasedWSS4JOutInterceptorInternal.handleMessage(PolicyBasedWSS4JOutInte
rceptor.java:158)
      at
org.apache.cxf.ws.security.wss4j.PolicyBasedWSS4JOutInterceptor$Policy
BasedWSS4JOutInterceptorInternal.handleMessage(PolicyBasedWSS4JOutInte
rceptor.java:88)
      at
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseIntercepto
rChain.java:263)
      at
org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:533)
      at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:463)
      at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:366)
      at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:319)
      at
org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:88)
      at
org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:134
)
      ... 2 more

Any idea ? What's wrong with this code ?

Best Regards.


--
Colm O hEigeartaigh

Talend Community Coder
http://coders.talend.com


--
Glen Mazza
Talend Community Coders - coders.talend.com
blog: www.jroller.com/gmazza

Reply via email to