Аутентификация с помощью заголовка SOAP - PullRequest
0 голосов
/ 02 сентября 2018

Есть классы, сгенерированные wsdl с ObjectFactory и интерфейсом для работы. Запрос формируется путем прикрепления заголовка к телу с токеном UserName. Я стараюсь так: Конфиг:

@PostConstruct
public void initialization() {
    JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
    factory.setServiceClass(EMyInterface.class);
    factory.setAddress(moneyTransferServiceWsdlUrl);

    factory.getOutInterceptors().add(new LoggingOutInterceptor());
    factory.getInInterceptors().add(new LoggingInInterceptor());
    factory.getInFaultInterceptors().add(new LoggingInInterceptor());

    service = (EMyInterface) factory.create();
    Client client = ClientProxy.getClient(service);

    HTTPConduit httpConduit = (HTTPConduit) client.getConduit();
    HTTPClientPolicy httpClientPolicy = new HTTPClientPolicy();
    httpClientPolicy.setConnectionTimeout(connectionTimeout);
    httpClientPolicy.setReceiveTimeout(receiveTimeout);
    httpConduit.setClient(httpClientPolicy);
}

@Bean
public EMyInterface subscribeInfo() {
    return service;
}

@Bean
public WebServiceTemplate getTemplate() {
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    try {
        marshaller.setContextPath(String.valueOf(JAXBContext.newInstance(ObjectFactory.class)));
    } catch (JAXBException e) {
        System.out.println(e.getErrorCode());
    }
    WebServiceTemplate template = new WebServiceTemplate();
    template.setDefaultUri(myServiceWsdlUrl);
    template.setMarshaller(marshaller);
    template.setUnmarshaller(marshaller);

    ClientInterceptor[] interceptors = new ClientInterceptor[]{
            securityInterceptor()
    };
    template.setInterceptors(interceptors);
    return template;
}

@Bean
public Wss4jSecurityInterceptor securityInterceptor() {
    Wss4jSecurityInterceptor wss4jSecurityInterceptor = new Wss4jSecurityInterceptor();
    wss4jSecurityInterceptor.setSecurementActions("UsernameToken");
    wss4jSecurityInterceptor.setSecurementUsername(myAuthName);
    wss4jSecurityInterceptor.setSecurementPassword(myPassword);
    wss4jSecurityInterceptor.setSecurementPasswordType(WSConstants.PW_TEXT);
    return wss4jSecurityInterceptor;
}

И поэтому я вызываю нужный мне метод из интерфейса:

@Service
public class EMyIntegrationImpl implements EMyIntegration {
    private final EMyInterface service;
    private final WebServiceTemplate webServiceTemplate;

    public EMyIntegrationImpl(EMyInterface service, WebServiceTemplate webServiceTemplate) {
        this.service = service;
        this.webServiceTemplate = webServiceTemplate;
    }

    @Override
    public MakeExtendedResult getMakeExtended(String param1, String param2, String param3) {
        MakeExtendedResult result;
        result = (MakeExtendedResult) webServiceTemplate.marshalSendAndReceive(
               service.makeExtended(param1, param2, param3)
        );
   }
}

Возвращает ошибку: org.apache.cxf.interceptor.Fault: Не удалось получить сообщение. В этом случае тело формируется нормально, а заголовок без userNameToken, в нем только адрес мыльного сервиса

...