Я использую этот замечательный плагин, http://grails.org/plugin/cxf-client, использовать контрактный веб-сервис с безопасностью.
Итак, у меня уже есть что-то подобное в моей конфигурации:
cxf {
client {
cybersourceClient {
clientInterface = com.webhost.soapProcessor
serviceEndpointAddress = "https://webhost/soapProcessor"
wsdl = "https://webhost/consumeMe.wsdl"
secured = true
username = "myUname"
password = "myPwd"
}
}
Это работает очень хорошо, но сейчас я хотел бы предоставить своим пользователям возможность вводить имя пользователя и пароль, чтобы они могли вводить свое имя пользователя и пароль для использования службы. Кто-нибудь знает как это сделать?
Я подозреваю, что он использует Custom In Interceptor, как в демонстрационном проекте:
package com.cxf.demo.security
import com.grails.cxf.client.CxfClientInterceptor
import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor
import org.apache.ws.security.WSPasswordCallback
import org.apache.ws.security.handler.WSHandlerConstants
import javax.security.auth.callback.Callback
import javax.security.auth.callback.CallbackHandler
import javax.security.auth.callback.UnsupportedCallbackException
class CustomSecurityInterceptor implements CxfClientInterceptor {
String pass
String user
WSS4JOutInterceptor create() {
Map<String, Object> outProps = [:]
outProps.put(WSHandlerConstants.ACTION, org.apache.ws.security.handler.WSHandlerConstants.USERNAME_TOKEN)
outProps.put(WSHandlerConstants.USER, user)
outProps.put(WSHandlerConstants.PASSWORD_TYPE, org.apache.ws.security.WSConstants.PW_TEXT)
outProps.put(WSHandlerConstants.PW_CALLBACK_REF, new CallbackHandler() {
void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
WSPasswordCallback pc = (WSPasswordCallback) callbacks[0]
pc.password = pass
pc.identifier = user
}
})
new WSS4JOutInterceptor(outProps)
}
}
Но поскольку я не создаю экземпляр этого перехватчика и не понимаю, как он создается, я не знаю, как я могу получить учетные данные пользователя, используемые в перехватчике.
Кто-нибудь знает, как это сделать/есть пример кода?
Спасибо!