2011-07-26 12 views
2

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(); 

答えて

2

これは現在サポートされていません。

注意:この時点で、WS-SecurityPolicyのサポートは、「WSDLファースト」シナリオでのみ使用できます。 WS-SecurityPolicyフラグメントは、WSDLからのみ取得できます。将来、さまざまなコードの最初のシナリオも可能にする予定ですが、現時点ではWSDLだけが利用可能です。

http://cxf.apache.org/docs/ws-securitypolicy.html

誰かがここに同じ問題を説明し、@Policyとソリューションを公開します。ただし、CXF < = 2.4.1の場合、ソリューションが不安定になります(ポリシーはWSDLに2回追加されます)。

http://cxf.547215.n5.nabble.com/WS-Security-policy-in-wsdl-for-java-first-approach-td569052.html

重複問題は修正されており、

https://issues.apache.org/jira/browse/CXF-3668を参照)2.4.2にリリースされます
関連する問題