do you have this in your client-config.wsdd?
<deployment ...>
<transport .../>
<globalConfiguration>
<requestFlow>
<!-- add the header that carries the user's login-name -->
<handler type="java:org.apache.ws.axis.security.WSDoAllSender">
<parameter name="action" value="UsernameToken"/>
<parameter name="actor" value="loginName"/>
<parameter name="passwordCallbackClass" value="PWCallback"/>
</handler>
?
otherwise there won't be any handler in the request flow that knows what to do
with those properties.
hth.
.............ron.
> Ok, so i got the server working basically (i think) but when calling it
> i get the following exception at the client:
>
> AxisFault
> faultCode:
> {http://schemas.xmlsoap.org/soap/envelope/}Server.generalException
> faultSubcode:
> faultString: WSDoAllReceiver: Request does not contain required
> Security header
>
>
> Thats the client code so far:
>
> try {
> binding = new al.JCT.service.JCTServiceLocator().getJCTSession();
> Stub axisPort = (Stub)binding;
> axisPort._setProperty(UsernameToken.PASSWORD_TYPE,
> WSConstants.PASSWORD_DIGEST);
> axisPort._setProperty(WSHandlerConstants.USER, "wss4j");
> axisPort._setProperty(WSHandlerConstants.PW_CALLBACK_REF, new
> PWCallback());
> }
> catch (javax.xml.rpc.ServiceException jre) {
> jre.printStackTrace();
> return;
> }
>
> try {
> al.JCT.service.Job[] value = null;
> String ids[] = {"1218"};
> value = binding.getJobStatus("rudi", "qw", null, ids);
> if (value != null) {
> for (int i=0; i < value.length; i++) {
> System.out.println(value[i].getId() + " - " +
> value[i].getName() + " - " + value[i].getPe());
> System.out.println(value[i].getReservations());
> System.out.println(value[i].getOutputPaths()[0].getPath());
> }
> }
> binding.submitJob(null, null, null);
> }
> catch (java.rmi.RemoteException re) {
> re.printStackTrace();
> return;
> }
>
>
> Any ideas on this one?
>
> Thx!
> Michael
>
>> you can extract all the security info by looking at the Vector stored
>> as a property in the MessageContext:
>> Vector resultHandlers =
>> (Vector)MessageContext.getCurrentContext().getProperty(WSHandlerConstants.RECV_RESULTS);
>>
>>
>> this vector contains, as far as i can tell, everything you could want
>> to know.
>> or you can extract the username from the message itself -
>> ArrayList actorList = new ArrayList();
>> actorList.add("actor value for my UsernameToken entry");
>> Message request = MessageContext.getCurrentContext().getRequestMessage();
>> SOAPEnvelope envelope = (SOAPEnvelope)request.getSOAPEnvelope();
>> Vector headers = envelope.getHeadersByActor(actorList);
>> SOAPHeaderElement header = (SOAPHeaderElement)headers.get(0);
>>
>> you can then extract the actual username by walking the DOM tree to
>> the node which contains the username
>> MessageElement usernameTokenElement =
>> header.getChildElement(USERNAME_TOKEN_QNAME);
>> MessageElement usernameElement =
>> usernameTokenElement.getChildElement(USERNAME_QNAME);
>> String username = usernameElement.getValue();
>>
>> (you'll also need these)
>> static final QName USERNAME_TOKEN_QNAME = new
>> QName(WSConstants.WSSE_NS, WSConstants.USERNAME_TOKEN_LN);
>> static final QName USERNAME_QNAME = new QName(WSConstants.WSSE_NS,
>> WSConstants.USERNAME_LN);
>>
>> in my app i have a handler which i put in the request chain right
>> after the WSDoAllReceiver which extracts the username using the above
>> code, does an LDAP lookup of the user to gather roles, and then
>> creates an app-specific user object which it stores it as a properly
>> in the MessageContext where anyone in the handling chain can then
>> extract it via getProperty().
>>
>> hth.
>> ......................ron.
>>
>> Michael Rudolf wrote:
>>
>>> Thanks a lot for the detailed description! I think this will work
>>> fine for me. One more question about this though: Can i read the
>>> username inside the web service? Or is there any way of getting
>>> information like the group a user belongs to inside the web service
>>> to read it there? It sounds like the Service does get any of this
>>> info since the authentication is completely transparent to the
>>> service itself.
>>> Thanks.
>>> Michael
>>>
>>>> by "Web Services are made out of Session EJBs" you mean you have
>>>> Session EJBs that expose a SOAP-over-HTTP interface? WSS4J uses 2
>>>> handlers, one client-side and one server-side (WSDoAllSender
>>>> (client) and WSDoAllReceiver (server)) which plug into the handler
>>>> chain supported by Axis to "intercept" the request on its way to the
>>>> server. WSDoAllSender adds a WSSecurity header to the SOAP message
>>>> on send (configured using a properties file). WSDoAllReceiver then
>>>> processes the incoming message, validates whatever it's configured
>>>> to validate and then passes the request on to your handlers/service
>>>> (or rejects the message if it does not validate properly). to add
>>>> UsernameTokens to a request and process them on the server requires
>>>> a CallbackHandler on the client side which can provide the password
>>>> for a user. this is then processed into a UsernameToken, included
>>>> in the SOAP header, and on the server side you'll need another
>>>> CallbackHandler which can provide the password for the user (pulled
>>>> from LDAP) which WSS4J will compare to what's provided in the
>>>> UsernameToken and thus authenicate the message before your service
>>>> (however it's implemented) ever gets called. it's quite transparent
>>>> for the most part. it also inserts a few entries in the
>>>> MessageContext so you can later determine what kind of authenication
>>>> has been done.
>>>>
>>>> hth.
>>>> .......................ron.
>>>> Michael Rudolf wrote:
>>>>
>>>>> Is there any difference in case the Web Services are made out of
>>>>> Session EJBs? Or does WSS4J work the same way in that case?
>>>>> Thanks!
>>>>> Michael
>>>>>
>>>>>> you may want to look at WSS4J and UsernameTokens. they're pretty
>>>>>> straight-forward as long as your client can support them. they
>>>>>> are part of
>>>>>> the WS-Security standard if you want to stick with "endorsed"
>>>>>> authentication
>>>>>> mechanisms. then on the server-side you'll typically need a JNDI
>>>>>> interface to
>>>>>> your LDAP server to authenticate the user on that side.
>>>>>>
>>>>>> hth.
>>>>>> ................ron.
>>>>>>
>>>>>>
>>>>>>
>>>>>>> Hi,
>>>>>>> is there any tutorial or example for authenticating users of we
>>>>>>> services
>>>>>>> by username and pass over HTTPS? Can anybody explain in more
>>>>>>> detail how
>>>>>>> this works? Is there any alternative to it? I want to query axis web
>>>>>>> sercvices from a portal. That uses LDAP for authetication. I
>>>>>>> would like
>>>>>>> to use the same directory for authenticating the users at the web
>>>>>>> services that are being queried.
>>>>>>> Thanks for any help!
>>>>>>> Michael
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>
>>
>>
>>
>
>