Rampart Axis2 несколько заголовков <wsse: Security> в запросе (ошибка) - PullRequest
1 голос
/ 20 октября 2011

Итак, я разрабатываю веб-сервис, используя rampart и axis2 в eclipse. Я пытаюсь реализовать простую схему аутентификации по имени пользователя и паролю, но у меня есть некоторые проблемы.

Мой код сейчас в основном работает, но в моем SOAP-запросе добавляется 3 (!) Раза:

        <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="UsernameToken-1">
           <wsse:Username>test</wsse:Username>
           <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">pass</wsse:Password>
        </wsse:UsernameToken>
        <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="UsernameToken-2">
           <wsse:Username>test</wsse:Username>
           <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">pass</wsse:Password>
        </wsse:UsernameToken>
        <wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="UsernameToken-3">
           <wsse:Username>test</wsse:Username>
           <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">pass</wsse:Password>
        </wsse:UsernameToken>

Ответ, который я получаю, правильный, поэтому я действительно не понимаю, почему один и тот же элемент заголовка добавляется три раза. Кто-нибудь может помочь?

Мой services.xml выглядит так:

Пожалуйста, введите описание вашей услуги здесь

<wsp:Policy wsu:Id="UTOverTransport"
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
    xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
    <wsp:ExactlyOne>
        <wsp:All>
            <sp:SignedSupportingTokens
                xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
                <wsp:Policy>
                    <sp:UsernameToken
                        sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient" />
                </wsp:Policy>
            </sp:SignedSupportingTokens>
            <ramp:RampartConfig xmlns:ramp="http://ws.apache.org/rampart/policy">
                <ramp:passwordCallbackClass>sec.PWCBHandler</ramp:passwordCallbackClass>
            </ramp:RampartConfig>

        </wsp:All>
    </wsp:ExactlyOne>
</wsp:Policy>


<messageReceivers>
    <messageReceiver mep="http://www.w3.org/2004/08/wsdl/in-only" class="org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver" />
    <messageReceiver  mep="http://www.w3.org/2004/08/wsdl/in-out"  class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/>
</messageReceivers>
<parameter name="ServiceClass" locked="false">sec.add</parameter>

А на стороне клиента мой axis2.xml выглядит так:

<wsp:Policy wsu:Id="UTOverTransport" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
    <wsp:ExactlyOne>
      <wsp:All>
        <sp:SignedSupportingTokens xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
            <wsp:Policy>
                <sp:UsernameToken sp:IncludeToken="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy/IncludeToken/AlwaysToRecipient" />
          </wsp:Policy>
        </sp:SignedSupportingTokens>
        <ramp:RampartConfig xmlns:ramp="http://ws.apache.org/rampart/policy"> 
            <ramp:user>test</ramp:user>
            <ramp:passwordCallbackClass>sec.PWCBHandler</ramp:passwordCallbackClass>
        </ramp:RampartConfig>
      </wsp:All>
    </wsp:ExactlyOne>
</wsp:Policy>

Мой Client.java реализован так:

public void invokeService(){

    ConfigurationContext ctx;
    try {
        ctx = ConfigurationContextFactory.createConfigurationContextFromFileSystem(this.path, null);
        AddStub stub = new AddStub(ctx,this.EPR);

        ServiceClient client = stub._getServiceClient();
        Options o = client.getOptions();
                    o.setUsername("test");
                    o.setPassword("pass");
        client.engageModule("rampart");

        AddStub.AddNumbers add = new AddStub.AddNumbers();
        add.setA(this.a);
        add.setB(this.b);

        System.out.println("Requesting");
        AddStub.AddNumbersResponse response = stub.addNumbers(add);
        System.out.println(response.get_return());

    } catch (AxisFault e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
    catch (RemoteException e) {
        e.printStackTrace();
    }
}
...