WS-security (usernametoken) для CXF - возможны ли зашифрованные пароли? - PullRequest
7 голосов
/ 19 января 2012

Я пытаюсь собраться вместе с реализацией WS-безопасности CXF (usernametoken). Я сделал все, как сказано в http://cxf.apache.org/docs/ws-security.html. Мой PasswordCallbackHandler, кажется, работает, но что беспокоит меня, так это часть:

    if (pc.getIdentifier().equals("joe")) {
        // set the password on the callback. This will be compared to the
        // password which was sent from the client.
        pc.setPassword("password");
    }

как сказано

Обратите внимание, что вплоть до CXF 2.3.x включительно, проверка пароля в особом случае простого текстового пароля (или любого другого, пока неизвестного типа пароля) делегируется классу обратного вызова, см. Org.apache.ws .security.processor.UsernameTokenProcessor # handleUsernameToken () метод javadoc проекта WSS4J. В этом случае ServerPasswordCallback должен выглядеть примерно так:

так что до cxf 2.3.x это было сделано так

   if (pc.getIdentifer().equals("joe") {
       if (!pc.getPassword().equals("password")) {
            throw new IOException("wrong password");
       }
    }

Моя проблема заключается в следующем: я не хочу использовать pc.setPassword ("plainTextPassword"), поскольку я хочу сохранить его в любом ресурсе. Этот дизайн до 2.3.x позволил бы мне сделать это, так как я мог зашифровать его вручную. Существуют ли способы установки зашифрованного пароля при обратном вызове или выполнения аутентификации на основе имени пользователя для сохраненных зашифрованных паролей?

Я использую cxf 2.5.x

Ответы [ 2 ]

6 голосов
/ 11 сентября 2012

Ответ (который я пробовал) находится на этой странице блога:

http://coheigea.blogspot.com/2011/06/custom-token-validation-in-apache-cxf.html

Суть в том, чтобы создать подкласс org.apache.ws.security.validate.UsernameTokenValidator и переопределите метод verifyPlaintextPassword.В этом методе передается UsernameToken (который предоставляет getName и getPassword).Бросьте исключение, если они не действительны.

Чтобы установить специальный валидатор в конфигурации пружины, добавьте, например,

  <jaxws:properties>
    <entry key="ws-security.ut.validator">
        <bean class="com.example.webservice.MyCustomUsernameTokenValidator" />
    </entry>
  </jaxws:properties>

в.

2 голосов
/ 23 марта 2015

Обработчики обратного вызова предназначены для предоставления пароля открытого текста или проверки пароля дайджеста, если известен пароль открытого текста.

Но если вы не знаете открытый текст, т. Е. Его одностороннее хеширование, то интерфейс обратного вызоване подходит, и вы должны создать класс, который реализует интерфейс Validator .

Вот мой пример реализации этого интерфейса, который использует репозиторий JPA, в котором пароль уже хранится как хеш BCrypt,

Использование с документально подтвержденным свойством ws-security.ut.validator здесь

, т. Е. Как свойство CXF <entry key="ws-security.ut.validator" value-ref="com.package.CustomUsernameTokenValidator" />

public class CustomUsernameTokenValidator implements Validator {
    @Autowired
    ProfileRepository profileRepository;
    @Override
    public Credential validate(Credential credential, RequestData requestData) throws WSSecurityException {
        Profile profile = profileRepository.findByName(credential.getUsernametoken().getName());
        if (profile != null) {
            if (BCrypt.checkpw(credential.getUsernametoken().getPassword(), profile.getPassword())) {
                return credential;
            }
        }
        throw new WSSecurityException(WSSecurityException.ErrorCode.FAILED_AUTHENTICATION);     
    }
}
...