我在WSO2 ESB中创建了代理服务并设置了UsernameToken身份验证。然而,看起来使用JDK中捆绑的JAX-WS来配置UsernameToken并不容易(如描述here所述),JDK必须进行修补等等。有没有一种方法可以像使用UsernameToken一样使用基本HTTP身份验证和ESB的凭据?基本身份验证代替WSO2 ESB中的代理服务器的UsernameToken
回答
根据Amila Suriarachchi的文章"Securing Web Service Integration"“WSO2 carbon支持UT,即使通过转换POX消息来进行HTTP基本认证”,但我不确定这是否与您的兴趣相关。
但是,使用JAX-WS客户端配置UsernameToken授权并不像看起来那么困难。您所要做的就是创建一个实现javax.xml.ws.handler.soap.SOAPHandler的类,并通过覆盖handleMessage(SOAPMessageContext messageContext)方法在出站消息中添加安全头。
我的Java版本是1.6.0_26(没有应用上述补丁),Web服务客户端存根类由JAX-WS RI 2.1.7根据Web服务的wsdl生成,由UsernameToken场景,并由WSO2 Carbon服务器(即Data Services Server-2.6.3)公开
我使用Apache WSS4J创建安全头 - 在这种情况下,只需实例化org.apache.ws.security.message.WSSecUsernameToken对象并通过setUserInfo(String user,String password)方法设置用户名和密码。此外,还应将时间戳记元素添加到传出SOAP消息的安全性标头中。 示例实现看起来是这样的:
public boolean handleMessage(SOAPMessageContext messageContext) {
Boolean isOutboundMessage = (Boolean) messageContext.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
if (isOutboundMessage) {
SOAPPart messageSoapPart = messageContext.getMessage().getSOAPPart();
WSSecHeader securityHeader = new WSSecHeader();
securityHeader.insertSecurityHeader(messageSoapPart);
WSSecUsernameToken usernameToken = new WSSecUsernameToken();
usernameToken.setPasswordType(WSConstants.PASSWORD_TEXT);
usernameToken.setUserInfo("root", "top_secret");
WSSecTimestamp timestamp = new WSSecTimestamp();
usernameToken.build(messageSoapPart, securityHeader);
timestamp.build(messageSoapPart, securityHeader);
}
return true;
}
提到另一个重要的事情是,SOAP头元素可能附带的mustUnderstand全球SOAP属性。参考Jim White撰写的文章Working with Headers in JAX-WS SOAPHandlers,该属性用于指示Web服务接收器或中介是否需要在处理消息之前理解标题元素。
如果mustUnderstand元素设置为true(soapenv:mustUnderstand =“1”),则应对getHeaders()方法进行编码,以告知运行时环境SOAP处理程序将负责处理mustUnderstand头元素返回一组匹配mustUnderstand头元素的QName(限定名称)对象。以下是处理安全性标头的getHeaders()方法。
public Set<QName> getHeaders() {
final String NAMESPACE_URI = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
final String LOCAL_PART = "Security";
final String PREFIX = "wsse";
final QName wssecurity = new QName(NAMESPACE_URI, LOCAL_PART, PREFIX);
final Set<QName> headers = new HashSet<QName>();
headers.add(wssecurity);
return headers;
}
最后,得到了服务端口,并调用它的任何方法要注册上述类的一个实例之前(比方说 - UsernameTokenSecuritySoapHandler)到您的Web服务客户端的处理程序链。这可以通过使用下面的代码来完成:
Service service = new Service();
service.setHandlerResolver(new HandlerResolver() {
public List<Handler> getHandlerChain(PortInfo portInfo) {
List<Handler> handlers = new ArrayList<Handler>();
handlers.add(new UsernameTokenSecuritySoapHandler());
return handlers;
}
});
另外 - 你会发现here由小杨对JAX-WS API的处理程序框架的优秀文章。
希望这会有所帮助。
- 1. WSO2 ESB:对代理服务使用基本身份验证
- 2. WSO2身份服务器身份验证
- 3. NodeJs HTTP代理基本身份验证
- 4. WSO2 ESB代理服务版本
- 5. WSO2身份服务器整合与ESB
- 6. Python中的HTTP代理服务器(带身份验证)
- 7. 网络代理服务器中的XACML身份验证
- 8. Windows上的WSO2 ESB代理服务
- 9. 用于WSO2 ESB代理服务的WSDL
- 10. Web服务的基本身份验证
- 11. 使用基本身份验证和代理身份验证的骆驼Http
- 12. 通过代理与Windows(NTLM)身份验证的基本身份验证访问Web服务
- 13. 代理服务器上的JAX-WS客户端身份验证
- 14. 代理服务器后面的安全表单身份验证
- 15. 使用httplib2处理身份验证和代理服务器
- 16. 如何在代理服务器中实现身份验证
- 17. WSO2身份服务器定制身份验证上下文类
- 18. 通过WSO2身份验证服务器从LDAP获取验证
- 19. 身份验证代理
- 20. Clickonce身份验证代理
- 21. org.apache.http.impl.client.CloseableHttpClient代理身份验证
- 22. Java代理身份验证
- 23. cefsharp代理身份验证
- 24. 服务器到服务器身份验证在wso2 API管理器
- 25. CQ基本身份验证
- 26. 通过代理服务器进行SharePoint身份验证
- 27. 使用Windows身份验证的简单身份验证代理
- 28. &lt;'代替'<' - WSO2代理服务
- 29. 具有基本身份验证的Apache反向代理
- 30. 代理建有不允许netcat的HTTP基本身份验证