Тип пароля Apache CXF всегда устанавливает дайджест - PullRequest
0 голосов
/ 20 апреля 2019

Я работаю над проектом клиента веб-службы и использую Apache CXF для отправки запроса веб-службе. Мне нужно установить PasswordType как PasswordText. Но даже если я установлю его в свойстве OutInterceptor, он всегда устанавливает passwordType как Digest. Как я могу решить эту проблему?

Мой код такой:

        JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
        factory.setServiceClass(Test.class);
        factory.setAddress(url);
        factory.getInInterceptors().add(new SoapActionInInterceptor(action));
        factory.getOutInterceptors().add(new SoapActionOutInterceptor());
        Map<String, Object> outProps = new HashMap<String, Object>();
        outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
        outProps.put(WSHandlerConstants.USER, username);
        outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PASSWORD_TEXT);

        ClientPasswordHandler handler = new ClientPasswordHandler();
        handler.setPassword(password);
        outProps.put(WSHandlerConstants.PW_CALLBACK_REF, handler);

        WSS4JStaxOutInterceptor wssOut = new WSS4JStaxOutInterceptor(outProps);
        factory.getOutInterceptors().add(wssOut);
        T serviceClient = (T) factory.create();
        Client client = ClientProxy.getClient(serviceClient);

        setClientPolicy(client);

И clientPolicy это

   protected synchronized void setClientPolicy(Client client) {
    if (client != null) {
        HTTPConduit httpConduit = (HTTPConduit) client.getConduit();
        httpConduit.setAuthSupplier(null);
        httpConduit.setAuthorization(null);
        HTTPClientPolicy clientPolicy = new HTTPClientPolicy();
        clientPolicy.setConnectionTimeout(60000L);
        clientPolicy.setReceiveTimeout(60000L);
        httpConduit.setClient(clientPolicy);
    }
   }

org.apache.cxf -> версия 3.1.6

org.apache.wss4j -> версия 2.1.7

1 Ответ

0 голосов
/ 26 апреля 2019

Я нашел решение. WSS4JStaxOutInterceptor расширяет AbstractWSS4JStaxInterceptor и имеет функцию для установки входящих свойств, которые мы отправляем. Когда он пытается установить свойство пароля, он проверяет входящее свойство в строке «PasswordText», а когда мы используем WSConstants, его значение отличается. Вот почему, когда мы устанавливаем значение свойства в строке «PasswordText», оно работает нормально. Конечный код перехватчика:

private WSS4JStaxOutInterceptor createSecurityInterceptor() {
    Map<String, Object> outProps = new HashMap<>();
    outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
    outProps.put(WSHandlerConstants.USER, username);
    // AbstractWSS4JStaxInterceptor class parseNonBooleanProperties require "PasswordText" check this function before changing this line
    outProps.put(WSHandlerConstants.PASSWORD_TYPE, "PasswordText");
    // AbstractWSS4JStaxInterceptor class parseNonBooleanProperties require "PasswordText" check this function before changing this line

    ClientPasswordHandler handler = new ClientPasswordHandler();
    handler.setPassword(password);
    outProps.put(WSHandlerConstants.PW_CALLBACK_REF, handler);
    return new WSS4JStaxOutInterceptor(outProps);
}

Это решает проблему.

...