Webサービスを保護するためにWS-Securityを使用したいと思います。私はCXFを使用してエンドポイントを公開し、Javaコード(別名CXFコードの最初のサービス)からWSDL生成を使用しています。CXF生成WSDLにWS-SecurityPolicy定義が含まれていません
このチュートリアルでは、WSDLを手動で管理されている場合CXFでWS-Securityを使用する方法について説明します。http://www.ibm.com/developerworks/java/library/j-jws13/index.html
しかし、私は自動的にWSDLを生成するためにCXFを使用しています。 生成されたWSDLは、クライアントがWS-Securityを使用する必要があることを示していません。私は、WSDLでこれに似た何かを期待する:
<wsp:Policy wsu:Id="UsernameToken" xmlns:wsu=
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
<wsp:ExactlyOne>
<wsp:All>
<sp:TransportBinding/>
<sp:SupportingTokens>
<wsp:Policy>
<sp:UsernameToken sp:IncludeToken=".../IncludeToken/AlwaysToRecipient"/>
</wsp:Policy>
</sp:SupportingTokens>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
私は春を使用していないんだけど、私は組み込みのJettyを使用しています。すべてを配線する方法は次のとおりです。
CXFNonSpringServlet cxfServlet = new CXFNonSpringServlet() {
private static final long serialVersionUID = 1L;
@Override
protected void loadBus(ServletConfig sc) {
super.loadBus(sc);
Map<String, Object> inProps = new HashMap<String, Object>();
inProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
inProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
inProps.put(WSHandlerConstants.PW_CALLBACK_REF, new TestCallback());
JaxWsServerFactoryBean factory = new JaxWsServerFactoryBean();
factory.setBus(bus);
factory.setServiceBean(new MyServiceEndpointImpl());
factory.setAddress("/myservice");
factory.getInInterceptors().add(new WSS4JInInterceptor(inProps));
factory.create();
}
};
Server server = new Server(8080);
ContextHandlerCollection contexts = new ContextHandlerCollection();
server.setHandler(contexts);
ServletContextHandler rootContext = new ServletContextHandler(contexts, "/");
rootContext.addServlet(new ServletHolder(cxfServlet), "/soap/*");
server.start();