我有一个新要求,但我不知道如何开发它,或者是否可能,问题是我的应用程序有一个 Web 服务器,但客户端想用两种不同的安全策略调用它,有时用 UsernameToken 调用它有时使用 BinarySecurityToken。
客户端将发送的标头是:
对于用户名令牌
<soapenv:Header>
<wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken wsu:Id="UsernameToken-3" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username>USER</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">PASS</wsse:Password>
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">Qm2Ytc9hW/xsQSo4KAurSQ==</wsse:Nonce>
<wsu:Created>2012-03-27T07:27:02.605Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
对于 BinarySecurityToken
<soapenv:Header>
<wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:BinarySecurityToken EncodingType="wsse:Base64Binary" ValueType="esquema" wsu:Id="SSOToken" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">MEEwNjJFNTU3QzN....G13eWo5RT0=</wsse:BinarySecurityToken>
</wsse:Security>
因此,对于 UsernameToken,我在 services.xml 中使用此代码 .. 它工作正常,在 PWCBHandler 中,我获取用户名和密码,并根据数据库对其进行验证。
<module ref="rampart" />
<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">
<wsp:ExactlyOne>
<wsp:All>
<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:SupportingTokens>
<ramp:RampartConfig xmlns:ramp="http://ws.apache.org/rampart/policy">
<ramp:passwordCallbackClass>com.aaa.bbb.ccc.impl.PWCBHandler</ramp:passwordCallbackClass>
</ramp:RampartConfig>
</wsp:All>
<wsp:All/>
</wsp:ExactlyOne>
</wsp:Policy>
问题是我不知道如何实现 BinarySecurityToken 的安全性,以便获取 base64 字符串并用它做任何我想做的事情,另一个疑问是我不知道我是否可以结合两个安全策略在同一个服务中,或者我应该公开另一个服务。