If you have a WS-SecurityPolicy in operation, it will take care of adding the correct headers, once you supply it with the correct information (username, password, etc.). Please take a look at the ws-security-examples systests to see how it all works.
Colm. On Mon, Oct 14, 2013 at 10:27 PM, Thomas Manson <[email protected]>wrote: > Hi Colm, > > I will resume work on this subject tomorrow. > > So I'm in a situation where there's no soap header setted, and the spring > configuraiton seems to be ignored (which would be quite logical as we don't > use it in the java code, just rebuiling all ourselves.) > > So how can I make sure the soap header is setted in my request? How can I > set the authentication type (username/password plain) ? > > Thanks, > Thomas. > > > On Mon, Oct 7, 2013 at 11:23 AM, Thomas Manson <[email protected] > > wrote: > >> Hi Colm, >> >> If I remove the <jaxws:client element, it still work as before, so I >> guess this client xml declaration is not taken into account as we're just >> programmatically re-doing what the spring configuration does... >> >> As I stated earlier, I'm already in a spring context (J2EE Spring MVC >> application), that's why I don't understand the BusFactory need to be given >> the spring xml file. >> >> I've understood that while seeing that the endpoint was not taken into >> account (thanks to my Virtual machine that changes of IP each time I resume >> my mac). >> >> So I'll focus to make it work programmatically first, then figure out >> how to use the spring XML configurations files and finally try to use my >> own generated WS Client instead of generating it on the fly. >> >> >> For now, I'm still blocked on enabling a security policy on the client >> side programmatically. >> For instance, my password callback handler is not taken into account, as >> it's not called at all. >> >> (the method public void handle(Callback[] callbacks) throwsIOException, >> UnsupportedCallbackException is not called) >> >> >> I programmatically specify it as follow (full code at the end of the >> mail): >> >> *this*.workListService = service.getPort(portQName, WorkListService.* >> class*); >> >> ((BindingProvider)*this*.workListService >> ).getRequestContext().put(BindingProvider.*ENDPOINT_ADDRESS_PROPERTY*, " >> http://192.168.2.213:8080/amxbpm/WorkListService"); >> >> //I've also tryed by just specificying a class name, but don't work >> either. >> >> PasswordCallbackHandler passwordCallbackHandler = >> *new*PasswordCallbackHandler( >> "secret"); >> ((BindingProvider)*this*.workListService >> ).getRequestContext().put(SecurityConstants.*CALLBACK_HANDLER*, >> passwordCallbackHandler); >> >> >> >> >> In the CXF samples, it's done like this: >> >> <jaxws:client name=*"{ >> http://www.example.org/contract/DoubleIt}DoubleItPlaintextPrincipalPort" >> * >> createdFromAPI=*"true"*> >> <jaxws:properties> >> <entry key=*"ws-security.callback-handler" >> * >> value=* >> "org.apache.cxf.systest.ws.wssec10.client.UTPasswordCallback"*/> >> </jaxws:properties> >> </jaxws:client> >> >> >> So I wonder what I miss... >> >> Thomas. >> >> >> package com.mansonthomas.amxbpm.customwebapp.services.amxbpm; >> >> import java.net.URL; >> import java.util.ArrayList; >> import java.util.List; >> >> import javax.xml.namespace.QName; >> import javax.xml.transform.Source; >> import javax.xml.ws.BindingProvider; >> import javax.xml.ws.EndpointReference; >> import javax.xml.ws.Service; >> import javax.xml.ws.WebServiceFeature; >> import javax.xml.ws.wsaddressing.W3CEndpointReference; >> import javax.xml.ws.wsaddressing.W3CEndpointReferenceBuilder; >> >> import org.apache.commons.logging.Log; >> import org.apache.commons.logging.LogFactory; >> import org.apache.cxf.Bus; >> import org.apache.cxf.bus.spring.SpringBusFactory; >> import org.apache.cxf.endpoint.Client; >> import org.apache.cxf.ws.security.SecurityConstants; >> import org.springframework.beans.factory.InitializingBean; >> >> import com.mansonthomas.amxbpm.customwebapp.model.WorkItemFwk; >> import com.mansonthomas.amxbpm.customwebapp.model.WorkListItemQuery; >> import >> com.mansonthomas.amxbpm.customwebapp.services.amxbpm.context.ContextService; >> import >> com.mansonthomas.amxbpm.customwebapp.services.amxbpm.mapper.WorkItemMapper; >> import >> com.mansonthomas.amxbpm.customwebapp.services.amxbpm.security.PasswordCallbackHandler; >> import com.tibco.n2.brm.api.GetWorkListItems; >> import com.tibco.n2.brm.api.GetWorkListItemsResponse; >> import com.tibco.n2.brm.api.OrderFilterCriteria; >> import com.tibco.n2.brm.api.WorkItem; >> import com.tibco.n2.brm.services.WorkListService; >> import com.tibco.n2.common.organisation.api.OrganisationalEntityType; >> import com.tibco.n2.common.organisation.api.XmlModelEntityId; >> >> public class WorkListServiceImpl2 implements WorkListFwkService, >> InitializingBean >> { >> >> private static final Log logger = >> LogFactory.getLog(WorkListServiceImpl2.class); >> >> >> >> private WorkListService workListService = null; >> private ContextService contextService = null; >> >> public WorkListServiceImpl2( ContextService contextService) throws >> Exception >> { >> this.contextService = contextService; >> >> SpringBusFactory bf = new SpringBusFactory(); >> URL busFile = >> this.contextService.getResource("/WEB-INF/spring/webservices2.xml"); >> >> Bus bus = bf.createBus(busFile.toString()); >> SpringBusFactory.setDefaultBus(bus); >> SpringBusFactory.setThreadDefaultBus(bus); >> >> URL wsdl = >> this.contextService.getResource("/wsdl/brm.wsdl"); >> >> Service service = Service.create(wsdl, new QName(" >> http://services.brm.n2.tibco.com","WorkListService")); >> >> QName portQName = new QName("http://services.brm.n2.tibco.com", >> "WorkListService_EP"); >> >> this.workListService = service.getPort(portQName, >> WorkListService.class); >> >> >> ((BindingProvider)this.workListService).getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, >> "http://192.168.2.213:8080/amxbpm/WorkListService"); >> >> PasswordCallbackHandler passwordCallbackHandler = new >> PasswordCallbackHandler("secret"); >> >> >> ((BindingProvider)this.workListService).getRequestContext().put(SecurityConstants.CALLBACK_HANDLER, >> passwordCallbackHandler); >> >> >> } >> >> public List<WorkItemFwk> getWorkListItems(String username, >> WorkListItemQuery workListItemQuery) >> { >> XmlModelEntityId entityId = new XmlModelEntityId(); >> entityId.setGuid(workListItemQuery.getUserGUID()); >> entityId.setEntityType(OrganisationalEntityType.RESOURCE); >> entityId.setModelVersion(-1); >> >> GetWorkListItems getWorkListItems = new GetWorkListItems(); >> >> getWorkListItems.setGetTotalCount (true); >> getWorkListItems.setEntityID (entityId); >> getWorkListItems.setStartPosition >> (workListItemQuery.getStart()); >> getWorkListItems.setNumberOfItems >> (workListItemQuery.getNumberOfItems()); >> getWorkListItems.setOrderFilterCriteria (new OrderFilterCriteria()); >> >> GetWorkListItemsResponse getWorkListItemsResponse = null; >> >> try >> { >> >> ((BindingProvider)this.workListService).getRequestContext().put("thread.local.request.context", >> "true"); >> >> ((BindingProvider)this.workListService).getRequestContext().put(SecurityConstants.USERNAME, >> username); >> >> getWorkListItemsResponse = >> this.workListService.getWorkListItems(getWorkListItems); >> } >> catch(Exception e) >> { >> logger.error("Error while getting worklistItems for >> "+workListItemQuery.toString(),e); >> } >> >> >> >> if(getWorkListItemsResponse == null) >> { >> logger.error("recieve a null response while getting worklistItems >> for "+workListItemQuery.toString()); >> return new ArrayList<WorkItemFwk>(0); >> } >> >> List<WorkItem> workitems = >> getWorkListItemsResponse.getWorkItems(); >> List<WorkItemFwk> workListItemFwk = new >> ArrayList<WorkItemFwk>(workitems.size()); >> >> >> int i = 0; >> for (WorkItem workItem : workitems) >> { >> workListItemFwk.add(WorkItemMapper.map(workItem, i++)); >> } >> return workListItemFwk; >> } >> >> @Override >> public void afterPropertiesSet() throws Exception >> { >> >> WorkListItemQuery workListItemQuery = new WorkListItemQuery(); >> >> workListItemQuery.setStart(0l); >> workListItemQuery.setNumberOfItems(10l); >> workListItemQuery.setUsername("tibco-admin"); >> workListItemQuery.setUserGUID("tibco-admin"); >> >> this.getWorkListItems("tibc-admin", workListItemQuery); >> >> } >> >> } >> >> >> >> > -- Colm O hEigeartaigh Talend Community Coder http://coders.talend.com
