如何将SOAP安全头(UsernameToken)信息添加到代码优先的Webservice生成的WSDL中

时间:2013-11-01 06:27:58

标签: java web-services soap wsdl cxf

我正在使用Apache CXF + Spring开发代码优先的WebService。我的Web服务期望UsernameToken存在于SOAP请求标头中,以便对调用客户端进行身份验证。 我的问题是,有没有办法在Java代码或配置文件中的某处添加SOAP安全头(UsernameToken)定义,因此生成的WSDL将包含安全性(UsernameToken)?请指教。

非常感谢:)

1 个答案:

答案 0 :(得分:3)

有关所需令牌的信息可以使用WS-Policies在WSDL中发布。对于用户名令牌,我使用以下策略:

<wsp:Policy wsu:Id="UP_policy" xmlns:wsp="http://www.w3.org/ns/ws-policy"
    xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
    <sp:SupportingTokens
        xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
        <wsp:Policy>
            <sp:UsernameToken
                sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
                <wsp:Policy>
                    <sp:WssUsernameToken11 />
                </wsp:Policy>
            </sp:UsernameToken>
        </wsp:Policy>
    </sp:SupportingTokens>
</wsp:Policy>

仅对请求消息(AlwaysToRecipient)要求UT。要在生成的WSDL中包含此类策略:

  • 将其保存到类路径中可用的文件,例如ut.policy.xml
  • @Policies({ @Policy(uri = "ut.policy.xml") })注释添加到服务类或接口

我修改了示例CXF项目。它显示了如何做到这一点。你可以找到它here

因此,您的WSDL将附加适当的WS-SecurityPolicy实例,告诉客户端需要Username令牌:

<wsdl:definitions ...>
    ...
    <wsdl:service name="GreeterService">
        <wsdl:port binding="tns:GreeterServiceSoapBinding" name="GreeterPort">
            <soap:address location="http://localhost:9000/SoapContext/GreeterPort"/>
        </wsdl:port>
        <wsp:PolicyReference URI="#UP_policy"/>
    </wsdl:service>
    <wsp:Policy xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" wsu:Id="UP_policy">
        <sp:SupportingTokens xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
            <wsp:Policy>
                <sp:UsernameToken sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
                    <wsp:Policy>
                        <sp:WssUsernameToken11/>
                    </wsp:Policy>
                </sp:UsernameToken>
            </wsp:Policy>
        </sp:SupportingTokens>
    </wsp:Policy>
</wsdl:definitions>

可以找到有关使用CXF配置WS-SecurityPolicy的更多信息here以及如何处理任何WS-Policy here