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.QName import javax.xml.parsers.DocumentBuilder import org.apache.cxf.binding.soap.SoapHeader import org.apache.cxf.headers.Header import org.apache.cxf.helpers.DOMUtils import org.apache.cxf.interceptor.LoggingInInterceptor import org.apache.cxf.interceptor.LoggingOutInterceptor import org.apache.cxf.jaxb.* import org.apache.ws.security.WSConstants import org.apache.ws.security.message.WSSecUsernameToken import org.grails.plugins.wsclient.service.WebService import org.w3c.dom.Document import org.w3c.dom.Element
1 comentario:
Excelente muchas gracias desde Colombia
Publicar un comentario