2010-06-22 4 views
19

मुझे एक एसओएपी अनुरोध का परीक्षण करने के लिए जावा जेएक्स-डब्ल्यूएस ऐप की एक सरल कमांड लाइन मिली है, लेकिन सर्वर पासवर्ड प्रकार को पासवर्ड टेक्स्ट होने की उम्मीद कर रहा है और मैं इसे सेट करने के तरीके पर फंस गया हूं। ..जेएक्स-डब्ल्यूएस पासवर्ड टाइप पासवर्डटेक्स्ट

कोड तो दिखाई देता है:

@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); 
     ... 

मैं सोप-UI का उपयोग अनुरोध परीक्षण किया है तो मैं जानता हूँ कि यह काम कर रहा। पासवर्ड प्रकार सेट करने में कोई मदद की सराहना की जाएगी।

धन्यवाद।

उत्तर

28

जो मूल HTTP प्रमाणीकरण के लिए उपयोगकर्ता नाम और पासवर्ड सेट करेगा। यदि आपने सोपूआई में इसका परीक्षण किया है, तो मैं अनुरोध करता हूं कि आप 'पासवर्ड टेक्स्ट' मूल्य का अनुमान लगा रहे हैं, अनुरोध विवरण फलक में 'WSS-password Type' है। यह WSS सुरक्षा सेट करता है, HTTP सुरक्षा नहीं।

जावा 6 में जेएक्स-डब्ल्यूएस के साथ आपको एसओएपी हेडर में WSS-Usertoken इंजेक्ट करने के लिए एक SOAPHandler संलग्न करने की आवश्यकता है। इस दौर के बारे में बहुत सारे बिट्स और बॉब्स हैं, लेकिन मुझे पोस्ट करने के लिए एक सिंगल लिंक नहीं मिला, इसलिए आपको जाने के लिए यहां कुछ कोड है ...

एक हैंडलर जोड़ने के लिए आपको कुछ चाहिए:

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! 

फिर सुरक्षाहैंडलर वर्ग कार्य करेगा। हैंडलर सामान्य चीजें हैं और सफल संदेशों और दोषों के लिए बुलाए जाते हैं, लेकिन शायद अधिक महत्वपूर्ण बात यह है कि उन्हें संदेश दिशानिर्देशों - आउटगोइंग अनुरोध के लिए और फिर आने वाली प्रतिक्रिया के लिए कहा जाता है। आप केवल आउटगोइंग संदेशों को संभालना चाहते हैं। तो अगर आप की तरह कुछ की आवश्यकता होगी: यहाँ कुछ मान्यताओं

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 
} 

मैं कर दिया है, लेकिन उम्मीद है कि यह आप के लिए जा रहा हो जाएगा!

दयालु संबंध।

+1

धन्यवाद। यह पूरी तरह से काम करता है और Googling द्वारा आपका जवाब लगभग असंभव था, इसलिए मुझे कुछ कीवर्ड जोड़ने की अनुमति दें। JAX-WS WSSE – Jimmy2Times

+1

इस कोड का उपयोग करते समय मुझे लॉग द्वारा निम्न अपवाद मिला: 'com.sun.xml.internal.messaging.saaj.soap.impl.ElementImpl addChildElement सेवर: SAAJ0101: SOAPBodyElement का अभिभावक होना चाहिए SOAPBody'। – Vic

5

यदि आप SOAPHandler इंटरफ़ेस को लागू करते हैं, तो विधि msgCtx.getMessage() संपूर्ण XML प्रस्तुत करेगा, और यदि आप बड़ी फ़ाइलों के साथ काम कर रहे हैं तो आपके पास मेमोरी त्रुटियां होंगी। मैं JAX-WS ग्राहक पर UsernameToken प्रमाणीकरण के साथ परीक्षण किया है और यह काम करता है:

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(); 
} 

संपादित करें: आप "rt.jar" JRE से classpath में जोड़ना चाहिए।

+0

मैं इसे कोशिश करता हूं लेकिन मुझे javax.xml.ws मिल रहा है। वेब सेवा सेवा: java.lang.ClassCastException: com.sun.xml.ws.message.DOMHeader com.sun.xml.ws.security.opt.impl पर नहीं डाला जा सकता है। outgoing.SecurityHeader \t com.sun.xml.wss.jaxws.impl.SecurityClientTube.processRequest (SecurityClientTube.javas50) \t com.sun.xml.ws.api.pipe.Fiber .__ doRun (फाइबर.जावा) : 1063) – Steve

+0

मुझे लगता है कि यह क्लासपाथ में मेट्रो डब्ल्यूएस जार होने से संबंधित है- लेकिन मुझे इसकी आवश्यकता है – Steve

संबंधित मुद्दे