Настройка WSS4J с помощью CXF - PullRequest
       19

Настройка WSS4J с помощью CXF

0 голосов
/ 22 сентября 2011

Я неплохо справлялся с настройкой контракта для первого набора веб-сервисов с использованием CXF, пока не начал добавлять фрагмент WSS4J.

Я пытаюсь отладить отправку пароля и войти в мыльный заголовок.Я получаю нулевое значение, когда я вызываю getPassword () в классе WSPasswordCallback.По конверту мыла видно, что пароль отправлен.

Этот пост, http://old.nabble.com/PasswordDigest-and-PasswordText-difference-td24475866.html, от 2009 года, заставил меня задуматься, если мне не хватает (нужно создать) UsernameTokenHandler.

И если это правда, может кто-нибудь указать мне, как я настроил бы его в XML-файле bean-компонента spring / cxf?

Буду признателен за любые советы или предложения.

Вот этот Java-файл:

package com.netcentric.security.handlers;

import java.io.IOException;
import javax.annotation.Resource;
import javax.com.urity.auth.callback.Callback;
import javax.com.urity.auth.callback.CallbackHandler;
import javax.com.urity.auth.callback.UnsupportedCallbackException;
import org.apache.ws.com.urity.WSPasswordCallback;

public class ServicePWCallback implements CallbackHandler
{
   @Override
   public void handle(Callback[] callbacks) throws IOException, 
                UnsupportedCallbackException {
        try {
            for (int i = 0; i < callbacks.length; i++) {
                if (callbacks[i] instanceof WSPasswordCallback) {

                    WSPasswordCallback pc = (WSPasswordCallback) callbacks[i];

                    sString login = pc.getIdentifier();

                    String password = pc.getPassword();
                    // password is null, not the expected myPASSWORD**1234

                    int n = pc.getUsage(); 
                    // this is 2 == WSPasswordCallback.USERNAME_TOKEN

              //...

Файл конфигурации CXF / Spring:


    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:jee="http://www.springframework.org/schema/jee"
           xmlns:jaxws="http://cxf.apache.org/jaxws"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
    http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"
        default-dependency-check="none" default-lazy-init="false">

        <import resource="classpath:META-INF/cxf/cxf.xml" />
        <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />

        <bean id="serverPasswordCallback" class="com.netcentric.security.handlers.ServicePWCallback"/>
        <bean id="wss4jInInterceptor" class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">
            <constructor-arg>
                <map>
                    <entry key="action" value="UsernameToken"/>
                    <entry key="passwordType" value="PasswordText"/>
                                    <entry key="passwordCallbackRef">
                        <ref bean="serverPasswordCallback"/>
                    </entry>
                </map>
            </constructor-arg>
        </bean>

        <jaxws:endpoint id="FederationImpl"
            implementor="com.netcentric.services.federation.FederationImpl"
            endpointName="e:federation"
            serviceName="e:federation"
            address="federation"
            xmlns:e="urn:federation.services.netcentric.sec">

                    <jaxws:inInterceptors>
                            <bean class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor"/>
                            <ref bean="wss4jInInterceptor"/>
                    </jaxws:inInterceptors>
        </jaxws:endpoint>
    </beans

Мыльное сообщение:


    <?xml version="1.0" encoding="UTF-8"?>
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <soapenv:Header>
            <wsse:comurity xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wscomurity-comext-1.0.xsd" soapenv:mustUnderstand="1">
                <wsu:Timestamp xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wscomurity-utility-1.0.xsd" wsu:Id="Timestamp-16757598">
                    <wsu:Created>2011-09-22T18:21:23.345Z</wsu:Created>
                    <wsu:Expires>2011-09-22T18:26:23.345Z</wsu:Expires>
                </wsu:Timestamp>
                <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wscomurity-utility-1.0.xsd" wsu:Id="UsernameToken-16649441">
                    <wsse:Username>pam</wsse:Username>
                    <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">myPASSWORD**1234</wsse:Password>
                </wsse:UsernameToken>
            </wsse:comurity>
        </soapenv:Header>
        <soapenv:Body>
            <getVersion xmlns="urn:federation.services.netcentric.com">
                <getVersionRequest/>
            </getVersion>
        </soapenv:Body>
    </soapenv:Envelope>

Ответы [ 3 ]

5 голосов
/ 23 сентября 2011

Если вы используете CXF 2.4.x, я бы порекомендовал прочитать:

http://coheigea.blogspot.com/2011/02/usernametoken-processing-changes-in.html

и посмотреть, поможет ли это предоставить дополнительную информацию. Блог Colm - это клад полезной информации о последних выпусках WSS4J.

3 голосов
/ 23 сентября 2011

Спасибо за вашу помощь.Я добился прогресса в этом.Я использую CXF 2.4.2 и WSS4J 1.6.2.Платформа теперь заботится о проверке пароля для вас.Таким образом, правильный внутренний раздел -

            if (callbacks[i] instanceof WSPasswordCallback) {
                WSPasswordCallback pc = (WSPasswordCallback) callbacks[i];
                sString login = pc.getIdentifier();
                String password = getPassword(login);
                pc.getPassword(login); 
                //...
            }

Вместо того, чтобы извлекать пароль из мыльного заголовка для сравнения с ожидаемым значением, вы ищите ожидаемое значение и передаете его в структуру для сравнения.

0 голосов
/ 16 февраля 2015

Я добавляю это:

// set the password on the callback. 
This will be compared to the            
// password which was sent from the client.            
pc.setPassword("password");

==> пароль между "" будет сравниваться с паролем, отправленным клиентом.

На стороне клиента: напишите login = bob;Пароль = bobPassword (будет перевариваться)

На стороне сервера: Catch user = bob и функция user.setPassword(bobPassword) проверяет, верен ли полученный пароль или нет.

...