JAX-WS username-password 来自 Java 11 & Gradle 的身份验证

JAX-WS username-password authentification from Java 11 & Gradle

我正在尝试从 Java 11 / Spring / Gradle 的项目中调用已使用 username/password 设置基本身份验证的 SOAP 端点。 我设法使用 JDK 8 classes 通过 wsimport 生成并找到了几种方法,但其中 none 有效。

第一种方法来自这里:https://mkyong.com/webservices/jax-ws/application-authentication-with-jax-ws/ 但是我得到一个 java.lang.IllegalArgumentException: *当我尝试

时,从方法引用的端口在 class 加载程序中不可见
Service service = Service.create(url, qname);
HelloWorld hello = service.getPort(HelloWorld.class);

我尝试使用服务 class 和 HelloWorld class 作为 classes 由 wsimport 生成或由我编写,正如本例中所做的那样:https://www.baeldung.com/spring-soap-web-service#1-generate-client-code

设置身份验证 headers 的第二种方法是

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

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

HelloWorld hello = service.getHelloWorldPort();

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

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

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

我的解决方案很复杂:

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