Я работаю над проектом, созданным с использованием Java 8 и Spring Boot, в который я хочу добавить Wss4jSecurityInterceptor для входа в систему. Пока что это то, что я сделал в классе WebServiceConfig
@Bean public AuthorizationCallBackHandler authorizationCallBackHandler(){ AuthorizationCallBackHandler callbackHandler = new AuthorizationCallBackHandler(); return callbackHandler; } @Bean public Wss4jSecurityInterceptor securityInterceptor(){ Wss4jSecurityInterceptor securityInterceptor = new Wss4jSecurityInterceptor(); securityInterceptor.setValidationActions("UsernameToken"); securityInterceptor.setValidationCallbackHandler(authorizationCallBackHandler()); return securityInterceptor; } @Override public void addInterceptors(List interceptors) { interceptors.add(securityInterceptor()); //interceptors.add(endPointInterceptor()); }
Итак, каждый запрос, поступающий в мой веб-сервис, будет перехватываться Wss4jSecurityInterceptor и обрабатыватьсямоим пользовательским обратным вызовом, определенным следующим образом, в состоянии сделать что-нибудь с этим. Чего мне не хватает в следующих настройках?
Это SOAP-вызов, который я выполняю с SOAP UI
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:it="some.fancy.ws"> <soapenv:Header> <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <wsse:UsernameToken wsu:Id="UsernameToken-3967AEB46D733EF6E2154990461080350"> <wsse:Username>Just a user</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">just a password</wsse:Password> <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">pUn8VjdpVaIamSAIwXEeXg==</wsse:Nonce> <wsu:Created>2019-02-16T17:03:30.803Z</wsu:Created> </wsse:UsernameToken></wsse:Security> </soapenv:Header> <soapenv:Body> <it:getPOrderRequest> <it:poNumber>2197111225-F03292</it:poNumber> </it:getPOrderRequest> </soapenv:Body> </soapenv:Envelope>
Для всех, кто заинтересовался, я решил эту проблему, в первую очередь удалив из запроса содержимое внутри заголовка. После этого я настроил Исходящий WSS с учетными данными, и вот так обработчик безопасности Wss4j преобразовал Обратный вызов в нужный мне экземпляр (то есть WSPasswordCallback). Извлеченный урок: если Wss4j обнаружит какую-то ошибку при обработке запроса SOAP, он сгенерирует CleanupCallback, а не экземпляр WSPasswordCallback