Hace ya mucho tiempo que no entraba a mi blog, y menos escribir en él.
He decidido hacerlo para compartir algo que a mi me sirvio en su momento, y espero que a alguien por alli tambien lo ayude.
El problema fue el sgte:
Teniamos unos WS que querian llamarlo por intermedio de una aplicacion web,
pero estos WS tenian una
Seguridad UserToken .
Bien en este pequeño articulo veran lo facil que es trabajar con Grails(Groovy) y sus herramientas en este caso
WSClient. la cual te permite conectarte a WS mediante
GroovyWS.
Sin mas....Comencemos:
WebService webService
...
def proxy = webService.getClient(wsdlURL)
En la primera linea inyectas la Clase WebService del plugin para usarlo para luego conectarte a un WS determinado, en este caso
wsdlURL vendria a ser la url del wsdl (Ejm: "http://localhost:9000/MyappAdminWeb/services/WSEjemplo?wsdl")
pero vamos al punto el UserToken Security:
List headers = new ArrayList();
headers.add(agregaCabecera(servicio))
Bueno alli esta ...esa es la solución, agregamos el código que setea las propiedades de la cabecera del WS y listo...Pero todavía falta la parte de la implementación del metodo
agregaCabecera, y es precisamente esa parte por la que todavia seguimos leyendo este articulo:
SoapHeader agregaCabecera (Servicio servicio) {
Document doc = DOMUtils.createDocument();
Element el = doc.createElementNS(WSConstants.WSSE_NS, "wsse:Security");
SoapHeader soapHeader = new SoapHeader(new QName(WSConstants.WSSE_NS, "Security"), el);
soapHeader.setMustUnderstand(true);
Element elem = (Element)soapHeader.getObject();
WSSecUsernameToken userTokenBuilder = new WSSecUsernameToken();
userTokenBuilder.setUserInfo(servicio.usuario, servicio.password)
userTokenBuilder.setPasswordType(WSConstants.PASSWORD_TEXT);
userTokenBuilder.prepare(elem.getOwnerDocument());
elem.appendChild(userTokenBuilder.getUsernameTokenElement());
return soapHeader
}
Servicio no es mas que un bean donde encapsulo el usuario y password de neustro WS y lo paso como parameto al metodo agregaCabecera en el cual vas a editar la cabecera SOAP para poner tu UserToken Security para luego lo agreguemos a request de nuestro WS.
proxy.client.getRequestContext().put(Header.HEADER_LIST, headers);
TIP: una de las cosas que me sirvio bastante es ver lo que imprimia la cabecera, para ello
tienes este par de lineas que te impriran y te mostrarán lo que hay en la cabecera de tu WS
proxy.client.getOutInterceptors().add(new LoggingOutInterceptor());
proxy.client.getInInterceptors().add(new LoggingInInterceptor());
Por ultimo quisiera mostrarles las clases que se importaron:import javax.xml.namespace.QNameimport javax.xml.parsers.DocumentBuilderimport org.apache.cxf.binding.soap.SoapHeaderimport org.apache.cxf.headers.Headerimport org.apache.cxf.helpers.DOMUtilsimport org.apache.cxf.interceptor.LoggingInInterceptorimport org.apache.cxf.interceptor.LoggingOutInterceptorimport org.apache.cxf.jaxb.*import org.apache.ws.security.WSConstantsimport org.apache.ws.security.message.WSSecUsernameTokenimport org.grails.plugins.wsclient.service.WebServiceimport org.w3c.dom.Documentimport org.w3c.dom.ElementNo fue fácil hallar esta solución ya que nunca había trabajado con WS con User Token Security, pero fíjense lo simple que puede ser el código, he encontrado que implementan una solución parecida pero con muchísima mas lineas de código.