401 Несанкционированный при попытке использовать SOAP WS из приложения Java EE - PullRequest
0 голосов
/ 06 мая 2019

У меня есть веб-сервис SOAP, который мне нужен, который использует WS Security и некоторые политики безопасности.

Когда я впервые попробовал использовать следующий код, подобный этому:

CMAdapterService cmAdapterService = new CMAdapterService(); CMAdapter port =
      cmAdapterService.getCMAdapterPort();

      // Use the BindingProvider's context to set the endpoint BindingProvider bp =
      (BindingProvider)port;



      Optional credentials
      bp.getRequestContext().put(BindingProvider.USERNAME_PROPERTY, "myUser");
      bp.getRequestContext().put(BindingProvider.PASSWORD_PROPERTY, "myPass");

      calling the webservice method CmReturn cmReturn =
      port.getPersonalData("12345"); System.out.println(cmReturn);

      byte[] imageData = port.getPersonalData("123") .getPersonalData()
      .getData();

С помощью приведенного выше кода я сталкиваюсь с исключением из политики, похожим на здесь , за исключением того, что моя политика не была ssl_policy , это была ATAlwaysCapability политика.

Я попробовал код из решения по приведенной выше ссылке, например так:

JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();

    factory.setServiceClass(CMAdapter.class);
    factory.setAddress("http://myHost:8080/bla/CMAdapter");

    CMAdapter cmAdapter = (CMAdapter) factory.create();

    Client client = ClientProxy.getClient(cmAdapter);
    HTTPConduit http = (HTTPConduit) client.getConduit();

    http.getAuthorization().setUserName("myUser");
    http.getAuthorization().setPassword("myPass");

    byte[] imageData = cmAdapter.getPersonalData("12345").getPersonalData().getData();

Однако приведенный выше код работает из настольного Java-приложения, но не работает при развертыванииэто на Wildfly как приложение Java EE (война).

Чтобы заставить его работать с Wildfly, я добавил следующие 4 зависимости, которые предоставлены в pom.xml maven:

<dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-ws-policy</artifactId>
        <version>3.3.1</version>
        <scope>provided</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-tools-common -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-tools-common</artifactId>
        <version>3.3.1</version>
        <scope>provided</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-frontend-jaxws -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-frontend-jaxws</artifactId>
        <version>3.3.1</version>
        <scope>provided</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.cxf/cxf-rt-transports-http -->
    <dependency>
        <groupId>org.apache.cxf</groupId>
        <artifactId>cxf-rt-transports-http</artifactId>
        <version>3.3.1</version>
        <scope>provided</scope>
    </dependency>

Я также отредактировал webapp / WEB-INF / jboss-deploy-struct.xml вот так:

    <?xml version="1.0" encoding="ISO-8859-1"?>
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.2">
    <deployment>
        <exclude-subsystems>
        </exclude-subsystems>
        <dependencies>
            <module name="org.jboss.ws.cxf.jbossws-cxf-client" services="import" />
            <module name="org.apache.cxf.impl">
                <imports>
                    <include path="META-INF"/>
                    <include path="META-INF/cxf"/>
                </imports>
            </module>
        </dependencies>
    </deployment>
</jboss-deployment-structure>

Однако, когда я пытаюсь вызвать веб-сервис из моего корпоративного Java-приложения, я получаю org.apache.cxf.transport.http.HTTPException: HTTP response '401: Не авторизован при общении с http://myHost:8080/bla/CMAdapter

1 Ответ

0 голосов
/ 06 мая 2019

Я решил проблему, выполнив этот поток SO

Мне нужно было добавить следующий код:

HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();

//This is the magic line. Setting this to false solved the problem
httpClientPolicy.setAllowChunking(false);

http.setClient(httpClientPolicy);

Не знаю точно, почему это сработало.Похоже, что wildfly разбивал запрос на части, и для некоторых причин имя пользователя и пароль были частично отправлены.

...