Hola a todos, estoy haciendo un WS con Axis2 agregandole seguridad de WSSL4j pero tengo problemas para comprobar si realmente la configuración del
service.xml esta correcto. Agradezco de antemano si me puede ayudar con este problema.
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:
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");
}
}
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).
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:
EchoServiceSecurityCallbackHandler.java
EchoServiceSecurityStub.java
Estos dos archivos los muevo a mi proyecto cliente.
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());
}
}
}