Authentication WSO2 ESB中代理服务器的基本身份验证而不是UsernameToken
我在WSO2 ESB中创建了一个代理服务,并设置了UsernameToken身份验证。然而,用绑定在JDK中的JAX-WS配置UsernameToken似乎不是那么容易(如前所述),必须对JDK进行修补等等。有没有一种方法可以像UsernameToken一样使用ESB凭据的基本HTTP身份验证?根据Amila Suriarachchi的文章“WSO2 carbon即使通过转换POX消息使用HTTP基本身份验证也支持UT”,但我不确定这是否与您的兴趣相关 然而,使用JAX-WS客户机配置UsernameToken授权并不像看上去那么难。您所要做的就是创建一个实现javax.xml.ws.handler.soap.SOAPHandler的类,并通过重写handleMessage(SOAPMessageContext)方法在出站消息中添加安全头 我的java版本是1.6.0_26(没有应用上述补丁),web服务客户端存根类由JAX-WS RI 2.1.7根据web服务的wsdl生成,由UsernameToken场景保护,并由WSO2 Carbon服务器(即数据服务服务器-2.6.3)公开 我用于创建安全标头—在本例中,只需实例化org.apache.ws.security.message.WSSecUsernameToken对象,并通过setUserInfo(String user,String password)方法设置用户名和密码。此外,还应将时间戳元素添加到传出SOAP消息的安全标头中。 示例实现可能如下所示:Authentication WSO2 ESB中代理服务器的基本身份验证而不是UsernameToken,authentication,wso2,wso2esb,Authentication,Wso2,Wso2esb,我在WSO2 ESB中创建了一个代理服务,并设置了UsernameToken身份验证。然而,用绑定在JDK中的JAX-WS配置UsernameToken似乎不是那么容易(如前所述),必须对JDK进行修补等等。有没有一种方法可以像UsernameToken一样使用ESB凭据的基本HTTP身份验证?根据Amila Suriarachchi的文章“WSO2 carbon即使通过转换POX消息使用HTTP基本身份验证也支持UT”,但我不确定这是否与您的兴趣相关 然而,使用JAX-WS客户机配置Usern
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的文章,该属性用于指示是否需要web服务接收方或中介在处理消息之前理解header元素
如果mustUnderstand元素设置为true(soapenv:mustUnderstand=“1”),则应该对getHeaders()方法进行编码,以告知运行时环境SOAP处理程序将通过返回一组与mustUnderstand头元素匹配的QName(限定名)对象来处理mustUnderstand头元素。下面是处理安全标头的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;
}
publicsetgetheaders(){
最后一个字符串名称空间_URI=”http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
最终字符串LOCAL_PART=“Security”;
最终字符串前缀=“wsse”;
final QName wssecurity=新的QName(名称空间\ URI、本地\部分、前缀);
final Set headers=new HashSet();
headers.add(wssecurity);
返回标题;
}
最后,在获取服务端口并调用其任何方法之前,您应该向web服务客户端的处理程序链注册上述类的实例(比如-usernameTokeSecuritySoapHandler)。这可以通过使用以下代码来完成:
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;
}
});
服务=新服务();
service.setHandlerResolver(新的HandlerResolver(){
公共列表getHandlerChain(PortInfo PortInfo){
列表处理程序=新的ArrayList();
add(新用户名TokenSecuritySoapHandler());
返回处理程序;
}
});
此外,您还可以找到Young Yang关于JAX-WSAPI处理程序框架的优秀文章
希望这有帮助