How to add Basic Authorization to a wsdl on startup with cxf?

非 Y 不嫁゛ 提交于 2020-01-07 03:10:09

问题


I have a wsdl client and autogenerated classes with cxf.

The wsdl's themselves require basic authorization to be accessd, thus I add the following to each BindingPort:

    Map<String, Object> requestContext = ((BindingProvider)sc).getRequestContext();
    requestContext.put(BindingProvider.USERNAME_PROPERTY, userName);
    requestContext.put(BindingProvider.PASSWORD_PROPERTY, password);

Problem: the evaluates first when running the webservice client. But before that, cxf is trying to initialize the wsdl service and also tries to fetch the wsdl from the url.

How can I get basic authorization in?

Caused by: org.apache.cxf.service.factory.ServiceConstructionException: Failed to create service.
    at org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.java:87)
    at org.apache.cxf.jaxws.ServiceImpl.initializePorts(ServiceImpl.java:218)
    at org.apache.cxf.jaxws.ServiceImpl.initialize(ServiceImpl.java:161)
    ... 58 more
Caused by: javax.wsdl.WSDLException: WSDLException (at /wsdl:definitions/wsdl:types/xsd:schema): faultCode=PARSER_ERROR: Problem parsing 'https://my.domain.com/MyService'.: java.io.IOException: Server returned HTTP response code: 401 for URL: https://my.domain.com/MyService
    at com.ibm.wsdl.xml.WSDLReaderImpl.getDocument(WSDLReaderImpl.java:2198)
    at com.ibm.wsdl.xml.WSDLReaderImpl.parseSchema(WSDLReaderImpl.java:830)
    at com.ibm.wsdl.xml.WSDLReaderImpl.parseSchema(WSDLReaderImpl.java:654)
    at com.ibm.wsdl.xml.WSDLReaderImpl.parseTypes(WSDLReaderImpl.java:610)
    at com.ibm.wsdl.xml.WSDLReaderImpl.parseDefinitions(WSDLReaderImpl.java:320)
    at com.ibm.wsdl.xml.WSDLReaderImpl.readWSDL(WSDLReaderImpl.java:2352)
    at com.ibm.wsdl.xml.WSDLReaderImpl.readWSDL(WSDLReaderImpl.java:2338)
    at org.apache.cxf.wsdl11.WSDLManagerImpl.loadDefinition(WSDLManagerImpl.java:229)
    at org.apache.cxf.wsdl11.WSDLManagerImpl.getDefinition(WSDLManagerImpl.java:163)
    at org.apache.cxf.wsdl11.WSDLServiceFactory.<init>(WSDLServiceFactory.java:85)
    ... 60 more
Caused by: java.io.IOException: Server returned HTTP response code: 401 for URL: https://my.domain.com/MyService
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(HttpURLConnection.java:1839)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1440)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254)
    at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:646)
    at com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:189)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:812)
    at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
    at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:243)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:348)
    at com.ibm.wsdl.xml.WSDLReaderImpl.getDocument(WSDLReaderImpl.java:2188)
    ... 69 more

回答1:


Solution from http://cxf.547215.n5.nabble.com/Retrive-WSDL-using-basic-authentication-td5724416.html

public class Authorization {

    public static void main(String[] args) throws Exception {
        String wsdl = "http://localhost/WebService/Service?wsdl";
        String username = "user";
        String password = "password";
        String method = "foo";

        Bus bus = CXFBusFactory.getThreadDefaultBus();
        MyHTTPConduitConfigurer conf = new MyHTTPConduitConfigurer(username, password);
        bus.setExtension(conf, HTTPConduitConfigurer.class); //important: do not use your implementation class, but the interface
        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance(bus);

        Client client = dcf.createClient(wsdl);

        Object[] res = client.invoke(method);

        System.out.println(Arrays.deepToString(res));
    }
}

class MyHTTPConduitConfigurer implements HTTPConduitConfigurer {

    private final String username;
    private final String password;

    public MyHTTPConduitConfigurer(String username, String password) {
        this.username = username;
        this.password = password;
    }

    @Override
    public void configure(String name, String address, HTTPConduit c) {
        AuthorizationPolicy ap = new AuthorizationPolicy();
        ap.setUserName(username);
        ap.setPassword(password);
        c.setAuthorization(ap);
    }
} 


来源:https://stackoverflow.com/questions/33521502/how-to-add-basic-authorization-to-a-wsdl-on-startup-with-cxf

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!