El servicio me levanta de forma correcta y en ningún momento me muestra error. Pero al parecer solo efectúa el llamado del metodo, en ningun momento se esta mandado a llamar el Handler que configure en el Service, para realizar la comprobación.
Cree un archivo que se llama PWCallBack.java el cual tiene System.out y Log.info para poderlo visualizar en la consola o en los logs, pero no me muestra nada, lo que me hace pensar que en ningún momento paso por ahí.
Los pasos que segui fueron los siguientes.
Del lado del servidor tengo mi archivo service.xml con la siguiente configuración.
Código HTML:
<?xml version="1.0" encoding="UTF-8"?> <service> <description> Web service</description> <messageReceivers> <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-out" class="org.apache.axis2.rpc.receivers.RPCMessageReceiver" /> </messageReceivers> <parameter name="ServiceClass">com.auntentia.ws.servidor.security.EchoSecurity</parameter> <operation name="datos" mep="http://www.w3.org/2004/08/wsdl/in-out" /> <requestFlow> <handler type="java:org.apache.ws.axis.security.WSDoAllReceiver"> <parameter name="usuario" value="panchoLopez"/> <parameter name="passwordCallbackClass" value="com.auntentia.ws.servidor.security.PWCallback"/> <parameter name="action" value="UsernameToken"/> <parameter name='passwordType' value='PasswordText'/> </handler> </requestFlow> <requestFlow > <handler type='java:org.apache.ws.axis.security.WSDoAllSender' > <parameter name='action' value='UsernameToken'/> <parameter name='user' value='ticket'/> <parameter name='passwordCallbackClass' value='com.auntentia.ws.servidor.security.PWCallback'/> <parameter name='passwordType' value='PasswordText'/> </handler> </requestFlow > </service>
Con 2 clases que contiene los siguiente
Código:
package com.auntentia.ws.servidor.security; public class EchoSecurity { public String datos(String usuario, String password) { System.out.println("Entra a autentificar usuario y password"); return "Se autentifico: " + usuario + " : " + password; } }
La segunda clase es:
Código:
De esto, genero un paquete echoServiceSecurity.aar que dejo en la ruta de mi servidor Apache (apache-tomcat-6.0.29\webapps\axis2\WEB-INF\services).package com.auntentia.ws.servidor.security; import java.io.IOException; import java.util.logging.Logger; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.callback.UnsupportedCallbackException; import org.apache.ws.security.WSPasswordCallback; public class PWCallback implements CallbackHandler { Logger LOG; /** * Servicio */ public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { String usuario = ""; String password = ""; for (Callback callback : callbacks) { System.out.println("Entro al proceso servidor"); LOG.info("Entro al proceso servidor"); if (callback instanceof WSPasswordCallback) { WSPasswordCallback pc = (WSPasswordCallback)callback; // set the password given a username System.out.println(pc.getIdentifer()); LOG.info(pc.getIdentifer()); if ("panchoLopez".equals(pc.getIdentifer())) { pc.setPassword("security"); System.out.println(pc.getPassword()); LOG.info(pc.getPassword()); } } else { System.out.println("ERROOOOORRRRR"); LOG.info("ERROOOOORRRRR"); throw new UnsupportedCallbackException(callback, "Unrecognized Callback"); } } System.out.println("Termino Proceso servidor"); LOG.info("Termino Proceso servidor"); } }
Corro mi servicio y cuando levanta me dirijo a la siguiente pagina
http://localhost:8080/axis2/services/EchoServiceSecurity?wsdl
Este me genera un archivo echoServiceSecurity.wsdl
El cual lo muevo a la axis2-1.4.1\axis2-1.4.1\bin con el proposito de que me cree mis archivos Java.
Me crea los siguientes archivos.
Código:
Estos dos archivos los muevo a mi proyecto cliente.EchoServiceSecurityCallbackHandler.java EchoServiceSecurityStub.java
Aquí mismo creo otro archivo de prueba que tiene lo siguiente.
Código:
package com.auntentia.ws.servidor.cliente; import java.rmi.RemoteException; import com.auntentia.ws.servidor.security.EchoServiceSecurityStub; public class TestSecurity { /** * Metodo principal de la clase * @param args */ public static void main(String[] args) { EchoServiceSecurityStub customer = null; EchoServiceSecurityStub.Datos request = null; EchoServiceSecurityStub.DatosResponse response = null; try { customer = new EchoServiceSecurityStub(); request = new EchoServiceSecurityStub.Datos(); request.setUsuario("Admin"); request.setPassword("security"); response = customer.datos(request); System.out.println(response.get_return()); } catch (RemoteException excepcionDeInvocacion) { System.err.println(excepcionDeInvocacion.toString()); } } }