1

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

非常感谢 :)

4

1 回答 1

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 项目。它显示了如何做到这一点。你可以在这里找到它。

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

<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 的更多信息以及如何在此处处理任何 WS- Policy

于 2013-11-01T11:58:51.800 回答