Información y enlaces
Participa comentando, viendo lo que otros tienen que decir, o enlazandolo desde tu blog.
- Otros artículos
- Bienvenido a la iniciativa Dharma
- Crítica a OpenBank
Preprocesado de peticiones SOAP en JAX-WS
En el caso de que necesitemos establecer algún tipo de preprocesamiento/filtro/mecanismo de seguridad a un servicio web, una de las formas más interesantes es utilizando los manejadores HandlerChain que proporciona JAX-WS 2.x.
En primer lugar implementamos el manejador, que nos permitirá realizar procesamientos y postprocesamientos sobre las peticiones SOAP que lleguen a nuestro servicios web. Os dejo un ejemplo de un manejador que permite filtrar por ip:
public class SecurityServiceWebHandler implements MessageHandler{
private static Log log=LogFactory.getLog(SecurityServiceWebHandler.class);
public Set getHeaders() {
return null;
}
public void close(MessageContext context) {
}
public boolean handleFault(MessageHandlerContext context) {
return true;
} /** Comprueba que las ips que acceden a la aplicación son efectivamente ip permitidas.
* @see javax.xml.ws.handler.Handler#handleMessage(javax.xml.ws.handler.MessageContext)
*/
public boolean handleMessage(MessageHandlerContext context) {
ServletRequest servletRequest = ((ServletRequest)context.get(MessageContext.SERVLET_REQUEST));
// Obtenemos la ip remota que invoca al Servicio Web
String remoteAddres=servletRequest.getRemoteAddr();
String allowed=”192.168.10.160,80.58.0.12″;
if(StringUtils.contains(allowed, remoteAddres)){
if(log.isInfoEnabled())log.info(”Servicio Web solicitado desde ip: “+remoteAddres);
}else{
log.error(”Acceso denegado. La ip “+remoteAddres+” no tiene permiso para acceder a los WS.”);
throw new WebServiceException(”Acceso denegado. La ip “+remoteAddres+” no tiene permiso para acceder a los WS.”);
}
return true;
}
}
Una vez implementado el manejador, lo siguiente es publicarlo en el fichero handlerchain.xml
<handler-chains xmlns=”http://java.sun.com/xml/ns/javaee”>
<handler-chain>
<handler>
<handler-class>org.viafirma.conector.security.SecurityServiceWebHandler</handler-class>
</handler>
</handler-chain>
</handler-chains>
El último paso es asociar nuestro servicio web con el manejador, mediante la anotación @HandlerChain.
@HandlerChain(file="handlerchain.xml")
@WebService(serviceName="ConectorFirmaRMIService",targetNamespace = "http://viafirma.org/client/", name = "ConectorFirmaRMIClient",portName="ConectorFirmaRMI",
endpointInterface = "org.viafirma.cliente.firma.rmi.FirmaClienteRMI")
public class ConectorFirmaRMI extends UnicastRemoteObject implements FirmaClienteRMI {
Como ejemplo, gracias a este código podremos recuperar y registrar las ips de todas las peticiones entrantes a nuestro servicio web, y denegar las ips no admitidas.