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