6 de marzo de 2012

Agregando UserToken Security con Grails


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

No 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.

Hasta la proxima.

1 comentario:

Anónimo dijo...

Excelente muchas gracias desde Colombia