XFire Web Service验证方案

原创 2006年06月20日 17:55:00
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搭建webService服务

后边有个项目需要接入4A,要用到webService服务,暂时还不确定是不是会有我的事,但为了有备无患,还是抽时间学习了以下相关的知识。 本来我所了解到的发布webService服务有用cxf和x...
  • tuzongxun
  • tuzongxun
  • 2016年06月06日 16:46
  • 3157

XFire实现身份验证(基于Xfire SOAP Header的WebService安全验证)

[java] view plaincopy 一、创建web services 工程(XFire),和平时的一样。   二、加入身份验证功能   1、首先编写服务端验证...
  • z69183787
  • z69183787
  • 2014年05月06日 09:53
  • 917

通过Xfire开发web service接口和客户端调用web service接口接口方法

通过Xfire开发web service接口 WebService接口的实现方式有很多种,常用的有  --AXIS框架的使用 --JAX-WS框架的使用   --XFire框架的使用 ...
  • cb2474600377
  • cb2474600377
  • 2015年03月10日 17:59
  • 3326

cxf与xfire互相调用,并且加验证机制

最近做的项目要完成与第三方系统进行webservice对接。
  • luoluo_wjx
  • luoluo_wjx
  • 2014年09月03日 10:13
  • 1716

关于在java6中使用XFire时碰到的一个问题Could not initialize Service

在一个采用了XFire作为WebService框架Web项目中,添加由JDK1.6 wsimport命令生成的一个WebService客户端调用,在客户端调用时出现了如下问题 log4j:WARN N...
  • tongsh6
  • tongsh6
  • 2016年07月31日 11:59
  • 2578

xfire 创建webservice客户端和服务端

本文来自:http://blog.csdn.net/java_cxrs/article/details/6448492 代码比较简单,按照如下来操作即可,只是jar包有很多问题, 比如找不到cla...
  • heqinghua217
  • heqinghua217
  • 2017年03月20日 17:09
  • 894

Web Service修炼之一XFire入门

Web Service修炼之一XFire入门 一、XFire知识 1、Web Service架构 web Service是独立的、模块化的应用,能够通过因特网来描述、发布、定位以及调用。在Web Se...
  • yinxiangbing
  • yinxiangbing
  • 2015年08月03日 21:52
  • 470

WebService的几种验证方式

WebService的几种验证方式 1.1      WebService设计 1.1.1   传输基本参数 1.1.2   传输数据集合 (1)     数组 (2)     ...
  • zzy7075
  • zzy7075
  • 2014年09月11日 10:37
  • 2096

Java开发Web Service的几种解决方案

转自:http://blog.csdn.net/zolalad/article/details/25158995 Java开发中经常使用到的几种WebService技术实现方案       ...
  • guoweimelon
  • guoweimelon
  • 2016年03月02日 11:54
  • 1890

XFire的DEMO使用

1.    Webserivces背景 WebService是一种跨编程语言和跨操作系统平台的远程调用技术。 从表面上看,WebService就是一个应用程序向外界暴露出一个能通过Web进行调用的...
  • cherishme1988
  • cherishme1988
  • 2015年04月13日 17:03
  • 1599
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:XFire Web Service验证方案
举报原因:
原因补充:

(最多只允许输入30个字)