У нас была такая же проблема при вызове веб-службы из сервлета, развернутого в Weblogic, с использованием weblogic.jws.jaxws.ClientPolicyFeature и weblogic.wsee.security.unt.ClientUNTCredentialProvider установить политику следующим образом:
import weblogic.jws.jaxws.ClientPolicyFeature;
import weblogic.jws.jaxws.policy.InputStreamPolicySource;
import weblogic.wsee.security.unt.ClientUNTCredentialProvider;
ClientPolicyFeature cpf = new ClientPolicyFeature();
InputStream inputStream = ChangeLogBean.class.getClassLoader().getResourceAsStream("usernametoken.xml");
cpf.setEffectivePolicy(new InputStreamPolicySource(new InputStream[]{inputStream}));
MyServiceWSPortImplService service = new MyServiceWSPortImplService(new URL(myEndpoint.getUrl()), new QName("http://myhost/myservice/V1", "MyServiceWSPortImplService"));
MyService port = service.getMyServicePort(new WebServiceFeature[]{cpf});
ArrayList credentialProviders = new ArrayList();
ClientUNTCredentialProvider untCredentialProvider = new ClientUNTCredentialProvider(myEndpoint.getUser().getBytes(), myEndpoint.getPassword().getBytes());
credentialProviders.add(untCredentialProvider);
Map context = ((BindingProvider)port).getRequestContext();
context.put(WSSecurityContext.CREDENTIAL_PROVIDER_LIST, credentialProviders);
Но стек WebServices, используемый нашим приложением, на самом деле является Apache CXF, который по-другому определяет политику (используя org.apache.neethi.Policy ) как упомянуто здесь:
http://cxf.apache.org/docs/how-to-define-policies.html#HowtoDefinePolicies-Dynamicallyviamessageproperty
Таким образом, стек CXF в основном игнорировал WSSecurityContext.CREDENTIAL_PROVIDER_LIST, и мы получили ошибку: Ошибка при проверке сообщения относительно политики безопасностиКод ошибки: 1000
В этом случае правильное решение состоит в том, чтобы использовать шаги, описанные в документации CXF:
- Получить политику из внешнего расположения и построить ее для текущего сообщения.
- Анализ XML-политики WS с использованием библиотеки Neethi.
- Сохранение объекта политики результатов в сообщении PolicyConstants.POLICY_OVERRIDEСвойство содержимого e.
Я просто упомяну это здесь на тот случай, если кто-то совершит ошибку, смешав CXF с Weblogic.:)