Authentication WSO2 ESB中代理服务器的基本身份验证而不是UsernameToken

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

我在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消息的安全标头中。 示例实现可能如下所示:

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处理程序框架的优秀文章

希望这有帮助