servicios services paso jax ejemplo crear consumir como java soap jax-ws wsse

java - services - JAX-WS Tipo de contraseña ContraseñaTexto



servicios web soap (2)

Eso configurará el nombre de usuario y la contraseña para la autenticación HTTP básica. Si lo has probado en SoapUI, supongo que el valor ''PasswordText'' del que hablas es ''WSS-Password Type'' en el panel de detalles de la solicitud. Eso establece la seguridad de WSS, no la seguridad de HTTP.

Con JAX-WS en Java6, debe conectar un SOAPHandler para inyectar WSS-Usertoken en el encabezado SOAP. Hay muchos detalles acerca de esto alrededor de la red, pero no pude encontrar un solo enlace para publicar, así que aquí hay un código para que empieces ...

Para agregar un controlador necesita algo como:

final Binding binding = ((BindingProvider) servicePort).getBinding(); List<Handler> handlerList = binding.getHandlerChain(); if (handlerList == null) handlerList = new ArrayList<Handler>(); handlerList.add(new SecurityHandler()); binding.setHandlerChain(handlerList); // <- important!

Entonces la clase SecurityHandler hará la escritura. Los manipuladores son cosas generales y reciben llamadas tanto para mensajes exitosos como para fallas, pero tal vez lo más importante sea que se llamen en ambas direcciones de mensaje: para la solicitud saliente y luego nuevamente para la respuesta entrante. Solo quieres gestionar los mensajes salientes. Entonces necesitarás algo como:

public final class SecurityHandler implements SOAPHandler<SOAPMessageContext> { ... @Override public boolean handleMessage(final SOAPMessageContext msgCtx) { // Indicator telling us which direction this message is going in final Boolean outInd = (Boolean) msgCtx.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); // Handler must only add security headers to outbound messages if (outInd.booleanValue()) { try { // Get the SOAP Envelope final SOAPEnvelope envelope = msgCtx.getMessage().getSOAPPart().getEnvelope(); // Header may or may not exist yet SOAPHeader header = envelope.getHeader(); if (header == null) header = envelope.addHeader(); // Add WSS Usertoken Element Tree final SOAPElement security = header.addChildElement("Security", "wsse", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"); final SOAPElement userToken = security.addChildElement("UsernameToken", "wsse"); userToken.addChildElement("Username", "wsse").addTextNode("MyWSSUsername"); userToken.addChildElement("Password", "wsse").addTextNode("MyWSSPassword"); } catch (final Exception e) { LOG.error(e); return false; } } return true; } ... // Other required methods on interface need no guts }

Aquí hice algunas suposiciones, ¡pero espero que te ayude!

Saludos cordiales.

Tengo una aplicación Java JAX-WS de línea de comando simple para probar una solicitud SOAP, pero el servidor espera que el tipo de contraseña sea PasswordText y no sé cómo configurar esto ...

El código se ve así:

@WebServiceRef private static final HelloService helloService = new HelloService(url, new QName( URL, "HelloService")); public static void main(final String... args) { try { final HelloPort helloPort = helloService.getHelloPort(); final BindingProvider hB = ((BindingProvider) helloPort); hB.getRequestContext().put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, END_POINT_ADDRESS); hB.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, USERNAME); hB.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, PASSWORD); ...

He probado la solicitud usando SOAP-UI, así sé que está funcionando. Se agradecería cualquier ayuda para establecer el tipo de contraseña.

Gracias.


Si implementa la interfaz SOAPHandler, el método msgCtx.getMessage () representará todo el XML, y si está trabajando con archivos grandes, tendrá errores de falta de memoria. Probé con la autenticación UsernameToken en el cliente JAX-WS y funciona:

String SECURITY_NS = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; String PASSWORD_TYPE = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText"; String AUTH_PREFIX = "wss"; MyService service = new MyService(); MyServicePort port = service.getMyServicePort(); try { SOAPFactory soapFactory = SOAPFactory.newInstance(); SOAPElement security = soapFactory.createElement("Security", AUTH_PREFIX, SECURITY_NS); SOAPElement uToken = soapFactory.createElement("UsernameToken", AUTH_PREFIX, SECURITY_NS); SOAPElement username = soapFactory.createElement("Username", AUTH_PREFIX, SECURITY_NS); username.addTextNode("username"); SOAPElement pass = soapFactory.createElement("Password", AUTH_PREFIX, SECURITY_NS); pass.addAttribute(new QName("Type"), PASSWORD_TYPE); pass.addTextNode("password"); uToken.addChildElement(username); uToken.addChildElement(pass); security.addChildElement(uToken); Header header = Headers.create(security); ((WSBindingProvider) port).setOutboundHeaders(header); // now, call webservice } catch (SOAPException ex) { ex.printStackTrace(); }

Editar: debe agregar "rt.jar" de jre a classpath.