XFire Web Service验证方案
XFire的文档做的真是相当的烂,非常不详细,看得匪夷所思,而且和发行的代码版本相当的不匹配,里面的示例根本无法运行,看得真是……相当窝火

公司项目XFire的服务框架我已经做好,这两天就要加入验证功能,而且要和整体权限框架(还没做)相结合
开始想通过HttpSession验证,这样可以很方便的和b/s的权限系统相统一,但实在不知道如何在客户端通过Spring或XFire访问HttpSession,XFire里的文档倒是提到了:
HttpServletRequest request = XFireServletController.getRequest();
HttpServletResponse response = XFireServletController.getResponse();

并且说只要在web.xml里配置XFireSpringServlet就可以,可是按照配了,结果还是不行
注:axis好像是有MessageContext可以很方便的访问到,xfire里也有MessageContext,可是getSession()出来的是null
如果有高手知道如何做还望麻烦告知

此条路不通只好去查XFire的文档关于authentication部分,大概有以下几种方案:
  1. HTTP Authentication
  2. SOAP Header authentication with JSR181
  3. SOAP authentication with handlers
  4. WS-Security
其中第一条HTTP Authentication的文档写的相当匪夷所思,文档写到如何在客户端指定用户名和密码
// Create your client
Client client = ....;

// Or get it from your proxy
Client client = ((XFireProxy) Proxy.getInvocationHandler(myClientProxy)).getClient();

client.setProperty(Channel.USERNAME, "username");
client.setProperty(Channel.PASSWORD, "pass");

去忘了写服务端应该怎么做,这个username和password该在那里验证呢??我翻遍了文档也没找着


来看第二条SOAP header authentication with JSR181,看起来倒是很简单

但是在Service的代码中每个方法里都要写一个UserToken验证的参数,虽然似乎权限粒度能控制得很细,但是这严重污染了业务逻辑的代码,非常的不优雅,放弃!


public void someOperation(String data, @WebParam(header=true) UserToken token) {
authenticate(token)

// do your normal request here
}

再看WS-Security,这是webservice的安全标准,但实在太复杂了,并且需要配置Service.xml,我们项目是Java1.5,Service.xml根本就没有写,是自动生成的,我是实在找不到Service.xml该在那配置?只好作罢


现在只剩下SOAP authentication with handlers,根据文档来看这是能够满足我的要求的,不侵入业务逻辑,能够和整体权限系统相结合,并且配置比较简单
把例子里的代码拷过来,发现根本不能用,少了yom这个包,在网上找了很久也没找到,后来发现yom其实就是yet(another) document object model,原来和dom是一回事嘛,用jdom替换,编译通过。

文档里遗漏了很重要的一点,就是关于如何在xfire-servlet里配置,导致很多人看了文档也进行不下去,我查了很久才在老外的一篇blog里找到一点tips,下面是配置:
    <!-- WebService base, do not modify it -->
    <bean id="webService" class="org.codehaus.xfire.spring.remoting.XFireExporter" abstract="true">
        <property name="serviceFactory">
            <ref bean="xfire.serviceFactory" />
        </property>
        <property name="xfire">
            <ref bean="xfire" />
        </property>
    </bean>

    <bean id="yourWebService" parent="webService">
        <property name="serviceBean">
            <ref bean="yourService" />
        </property>
        <property name="serviceClass">
            <value>your.package.YourServiceInterface</value>
        </property>
        <property name="inHandlers">
            <ref bean="authenticationHandler"/>
        </property>
    </bean>

AuthenticationHandler需要修改一下,其他不用变:

AuthenticationHandler.java

import org.apache.log4j.Logger;
import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.handler.AbstractHandler;
import org.codehaus.xfire.fault.*;
import org.jdom.*;

public class AuthenticationHandler extends AbstractHandler {
    private static final Logger log = Logger.getLogger(AuthenticationHandler.class);
   
    public void invoke(MessageContext context) throws Exception {
        log.info("authentication handler is invoked");
        if (context.getInMessage().getHeader() == null)
        {
            throw new XFireFault("Request must include company authentication token.",
                                 XFireFault.SENDER);
        }
        Element header = context.getInMessage().getHeader();
        Element token = header.getChild("AuthenticationToken");
       
        if (token == null)
        {
            throw new XFireFault("Request must include authentication token.",
                                 XFireFault.SENDER);
        }

        String username = token.getChild("Username").getText();
        String password = token.getChild("Password").getText();

        try {
            // 现在你已经得到了客户端传来的username和password,那就验证它吧(可以交给acegi来验证)
            }

        }catch(Exception e) {
            log.warn(e);
            throw new XFireFault("Authentication Failed.",
                    XFireFault.SENDER);
        }
    }
}

客户端代码:

            Service serviceModel = new ObjectServiceFactory().create(YourService.class);
            YourService service = (YourService) new XFireProxyFactory().create(serviceModel,
                 "http://localhost:8080/YourProject/service/YourService");
            XFireProxy proxy = (XFireProxy)Proxy.getInvocationHandler(service);
            Client client = proxy.getClient();
            client.addOutHandler(new ClientAuthHandler("jeffrey", "killjava"));
            // 执行下面代码会进行验证
            service.someOperation();
阅读更多
想对作者说点什么? 我来说一句

XFire Web service所有包

2011年03月11日 13.61MB 下载

XFire Java Web Service 客户端

2013年01月07日 4KB 下载

xfire开发web service文档.rar

2009年11月20日 324KB 下载

没有更多推荐了,返回首页

不良信息举报

XFire Web Service验证方案

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭