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

Я создал веб-сервис Axis2 с защитой Rampart, но постоянно получал NullPointerException в этой строке:

if((pwcb.getIdentifier().equals("bob")) && pwcb.getPassword().equals("bobPW")) )

Поэтому я добавил этот код:

if ( pwcb.getPassword()==null) {  
    throw new Exception ("passsssssssss is null:"+pwcb.getPassword());
}

Что вызвало исключение; поэтому я знаю, что проблема в том, что pwcb.getPassword равно нулю, но не понимаю, почему.

Это запрос SOAP, который я отправляю:

<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:nilo="http://nilo">
    <soapenv:Header>
        <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" soapenv:mustUnderstand="1">
            <wsse:UsernameToken xmlns:wsu="http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="123">
                <wsse:Username>bob</wsse:Username>
                <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">bobPW</wsse:Password>
            </wsse:UsernameToken>
        </wsse:Security>
    </soapenv:Header>
    <soapenv:Body>
        <nilo:getdataForChecking>
            <nilo:data>tranXml</nilo:data>
        </nilo:getdataForChecking>
    </soapenv:Body>
</soapenv:Envelope>

Вот метод handle, который я использую:

public void handle(Callback[] callbacks)   throws IOException,  UnsupportedCallbackException {
    for (int i = 0; i < callbacks.length; i++) {
        //When the server side need to authenticate the user
        WSPasswordCallback pwcb = (WSPasswordCallback)callbacks[i];

        if ( pwcb.getPassword()==null) {
            try {
                throw new Exception ("passsssssssss null:"+pwcb.getPassword());
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        else {
            try {
                throw new Exception ("pass nooot null:"+pwcb.getPassword());
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

        if(pwcb.getIdentifier().equals("bob") && pwcb.getPassword().equals("bobPW")) {
            return;
        } 

        //When the client requests for the password to be added in to the 
        //UT element

    }
}

person Tania Marinova    schedule 09.05.2013    source источник


Ответы (2)


Содержит ли WSPasswordCallback пароль, зависит от его поля usage. Например, для использования USERNAME_TOKEN_UNKNOWN устанавливается пароль, и обработчик обратного вызова должен генерировать исключение, если оно не соответствует имени пользователя. С другой стороны, для SIGNATURE поле пароля пусто, и обратный вызов должен установить его, чтобы ключ можно было получить из хранилища ключей.

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

// Rampart expects us to do authentication in this case
if (pwcb.getUsage() == WSPasswordCallback.USERNAME_TOKEN_UNKNOWN) {
  String password = passwordFor(pwcb.getIdentifier());
  if (pwcb.getPassword().equals(password))
    return;
  throw new UnsupportedCallbackException(callback,
      "password check failed for user " + pwcb.getIdentifier());
}
if (pwcb.getUsage() == WSPasswordCallback.SIGNATURE) {
  pwcb.setPassword(passwordFor(pwcb.getIdentifier()));
person Michał Grzejszczak    schedule 15.06.2013

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

Изменение этой строки с: if((pwcb.getIdentifier().equals("bob")) && pwcb.getPassword().equals("bobPW")) )

to:

if (pwcb.getIdentifier().equals("bob")) { pwcb.setPassword("bobPW"); }

person zyked    schedule 06.11.2014
comment
Итак... разработчики CXF предполагают, что мы где-то храним чистый текстовый пароль... я что-то упустил? - person Maciej Miklas; 09.02.2018