【问题标题】:JAX-WS username-password authentification from Java 11 & Gradle来自 Java 11 和 Gradle 的 JAX-WS 用户名-密码认证
【发布时间】:2021-02-25 09:51:27
【问题描述】:

我正在尝试调用一个 SOAP 端点,该端点已使用 Java 11 / Spring / Gradle 的项目中的用户名/密码设置了基本身份验证。 我设法使用 JDK 8 使用 wsimport 生成了这些类,并找到了几种方法,但它们都不起作用。

第一种方法来自这里:https://mkyong.com/webservices/jax-ws/application-authentication-with-jax-ws/ 但我得到一个 java.lang.IllegalArgumentException: *当我尝试时,从方法引用的端口在类加载器中不可见

Service service = Service.create(url, qname);
HelloWorld hello = service.getPort(HelloWorld.class);

我尝试使用 Service 类和 HelloWorld 类作为由 wsimport 生成的类或由我编写的类,就像在这个例子中所做的那样:https://www.baeldung.com/spring-soap-web-service#1-generate-client-code

设置身份验证标头的第二种方法是使用

BindingProvider prov = (BindingProvider)tilwsPort;
prov.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "username");
prov.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "pass");

我还尝试通过调用服务的生成方法来获取接口,例如:

HelloWorld hello = service.getHelloWorldPort();

有什么建议应该是正确的方法吗?谢谢!

【问题讨论】:

    标签: java gradle soap jax-ws


    【解决方案1】:

    您可以尝试通过 HTTP_REQUEST_HEADERS 属性设置身份验证,而不是直接在 RequestContext 中使用用户名和密码。在您提供的第一个链接中,您有示例

    Map<String, Object> req_ctx = ((BindingProvider)hello).getRequestContext();
        req_ctx.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, WS_URL);
    
        Map<String, List<String>> headers = new HashMap<String, List<String>>();
        headers.put("Username", Collections.singletonList("mkyong"));
        headers.put("Password", Collections.singletonList("password"));
        req_ctx.put(MessageContext.HTTP_REQUEST_HEADERS, headers);
    

    【讨论】:

    • 问题是我的代码没有到达那里,我得到 java.lang.IllegalArgumentException: *当我想访问接口时,类加载器看不到从方法引用的端口端点。这里:HelloWorld hello = service.getHelloWorldPort(); (或在其他方法中 HelloWorld hello = service.getPort(HelloWorld.class);)
    • 所以,显然这是一个 Spring Devtools 问题,我用这个解决方案绕过了它:stackoverflow.com/questions/50465170/… 现在我得到另一个异常,它与身份验证相关:com.sun.xml.ws.client .ClientTransportException:HTTP 传输错误:javax.net.ssl.SSLHandshakeException:PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径
    • 对,您必须在您的客户端上禁用 SSL 检查
    • 是的,这是我至少在本地应用的修复,因此我可以测试端点,如下所述:stackoverflow.com/a/47050878/8745761
    【解决方案2】:

    我的解决方案很复杂:

    1. 必须为 Spring Dev-tools 创建一个 .properties 文件(参见上面的 cmets),以便忽略生成的文件。
    2. 使用带有 BindingProvider 的解决方案设置身份验证。
    3. 禁用本地测试的 SSL 检查(见上面的评论)。

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      相关资源
      最近更新 更多