`

spring2.5+xfire+ws-security

    博客分类:
  • J2EE
阅读更多

public static void main(String[] args) throws MalformedURLException {
Service serviceModel = new ObjectServiceFactory().create(BbtForumSerivice.class);
//web services地址
String serviceURL="http://172.16.2.231:8082/services/BbtForumSerivice";

BbtForumSerivice service = (BbtForumSerivice)serviceFactory.create(serviceModel,serviceURL);
//访问服务的客户端
Client client = ((XFireProxy)Proxy.getInvocationHandler(service)).getClient();
//添加流模型和DOM
client.addOutHandler(new DOMOutHandler());
//以下代码添加一个Handler,通过属性对象的设置往SOAP中添加用户名/密码的凭证
Properties properties = new Properties();
/**
* 用户密码加密
*/

//指定动作
properties.setProperty(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
//WSConstants.PW_DIGEST表示密码以摘要方式发送,这可以保证密码的传输安全。设置为WSConstants.PW_TEXT表示密码以明文方式发送
properties.setProperty(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PASSWORD_DIGEST);
//指定了一个用户名,一般情况下,用户的密码保存在文件中或数据库中
properties.setProperty(WSHandlerConstants.USER, "client-344-839");
//指定一个回调类PasswordHandler完成用户密码的获取操作
properties.setProperty(WSHandlerConstants.PW_CALLBACK_CLASS, PasswordHandler.class.getName()); 
       
}

 

http://security.iteye.com/blog/28480

 

http://www.iteye.com/topic/277862

 

  1. org.codehaus.xfire.fault.XFireFault: WSS4JInHandler: Request does not contain required Security header   ??

解决:http://hi.baidu.com/xcl119xcl/blog/item/68fef49b166411bcc8eaf457.html

 

16.7.2  使用用户名/密码进行身份认证

http://book.csdn.net/bookfiles/466/10046616428.shtml

对SOAP报文进行身份认证的方式很多,不过都是通过在SOAP报文头中添加一些安全凭证(Security Token)信息来完成的,主要包括以下一些身份凭证:

— 用户名/密码;

—  X.509证书;

—  Kerberos票据和认证者;

—  SIM卡的移动设备安全性凭证。

其中用户名/密码是最简单的身份认证方式,它不需要密钥、数字证书,所以也就不需要CA,部署实施简单易行。下面我们就通过例子讲解如何进行基于用户名/密码的SOAP认证。这个实例让客户端提供用户名/密码,服务端验证客户端的身份,而客户端按正常方式接收SOAP响应报文。

服务端

服务端创建一个applicationContext-ws-security.xml,让BbtForumService拥有用户名/密码的认证功能。

代码清单16-10  applicationContext-ws-security.xml:身份认证

 

由于需要对SOAP进行前置处理,所以必须将STAX流模型的SOAP转换为DOM模型,这通过在②处指定一个DOMInHandler来完成。在③处注册了一个处理SOAP报文的WSS4JInHandler,用于对接收的SOAP报文进行前置处理,与其对应的是WSS4J OutHandler,它对SOAP报文进行后置处理。两者都具有极高的定制性,可以通过配置定制各种加工逻辑,这可以通过合理设置properties属性达到各种加工处理的要求。

在④处,我们定义了一个action属性,它定义了需要处理的动作,UsernameToken表示进行用户名/密码认证的操作。其他的动作包括Encrypt、Signature、Timestamp、SamlTokenUnsigned等,可以同时设置多个动作,多个动作之间用空格分隔,如<prop key="action">Encrypt Signature</prop>。

不同的动作通过设置配套的其他属性提供相应的操作,我们通过passwordCallback Class属性指定一个密码回调实现类来处理UsernameToken密码查询和认证的工作。

passwordCallbackClass指定的类必须实现javax.security.auth.callback.CallbackHandler接口,其代码如代码清单16-11所示:

代码清单16-11  UtPasswordHandler

 

PasswordHandle负责根据用户名查询正确的密码,这里,我们通过一个pwMockDB模拟存储用户名密码的数据库,如①所示。如果客户端以明文形式发送密码,UtPasswordHandler可以直接判断密码的正确性,如②-4所示。反之,如果以摘要的方式发送密码,UtPasswordHandler必须将正确的密码设置到callback中,以便WSS4JInHandler进行判断,如②-5所示。这里为明文和密文的密码分别提供了处理逻辑,但在一般情况下,密码是以明文还是密文发送是交互双方已经约定好的。

用户也可以通过扩展XFire的AbstractHandler定义自己的Handler,回调接口会传入MessageContext实例,可以通过MessageContext访问到SOAP中用户名/密码的信息进行认证。

客户端

现在服务端的Web Service服务已经需要对请求SOAP报文进行用户名/密码的认证了,客户端当然要进行相应的调整,以便在发送SOAP请求报文时添加用户名/密码的信息。

代码清单16-12  BbtForumServiceUTClient

package com.baobaotao.xfire.wss4j.client;

import java.lang.reflect.Proxy;

import java.net.MalformedURLException;

import java.util.Properties;

import org.apache.ws.security.WSConstants;

import org.apache.ws.security.handler.WSHandlerConstants;

import org.codehaus.xfire.client.Client;

import org.codehaus.xfire.client.XFireProxy;

import org.codehaus.xfire.client.XFireProxyFactory;

import org.codehaus.xfire.security.wss4j.WSS4JOutHandler;

import org.codehaus.xfire.service.Service;

import org.codehaus.xfire.service.binding.ObjectServiceFactory;

import org.codehaus.xfire.util.dom.DOMOutHandler;

import com.baobaotao.xfire.server.BbtForumService;

 

服务端在接收添加WS-Security信息的SOAP请求报文前必须进行前置处理,和服务端相对应,客户端在发送SOAP请求报文前进行前置处理,添加WS-Security信息。因此使用DOMOutHandler将DOM转换为STAX的流模型,此外通过定义一个WSS4JOutHandler完成在SOAP头添加用户名/密码信息的操作。

在④-2处,定义了密码的类型,WSConstants.PW_DIGEST表示密码以摘要方式发送,这可以保证密码的传输安全。设置为WSConstants.PW_TEXT表示密码以明文方式发送。④-3指定了一个用户名client,一般情况下,用户的密码保存在文件中或数据库中,因此通过指定一个回调类UtPasswordHandler完成用户密码的获取操作,如④-4,回调类必须实现javax.security.auth.callback.CallbackHandler接口,UtPasswordHandler的代码如代码清单16-13所示:

代码清单16-13  UtPasswordHandler

 

运行代码清单16-12,通过类似于TcpTrace的工具截取SOAP请求报文,用户将可以看到带WS-Security报文头的SOAP报文:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"

    xmlns:xsd="http://www.w3.org/2001/XMLSchema"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <soap:Header>

        <wsse:Security soap:mustUnderstand="1"

            xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401

-wss-wssecurity-secext-1.0.xsd">

<wsse:UsernameToken>

                <wsse:Username>client</wsse:Username>

                <wsse:Password>wOtW+umoWdf/7s7pyJrlFAp2xJo=</wsse:Password>

                <wsse:Nonce>zJlCTQNCa+jHur2JdJF8Fw==</wsse:Nonce>

                <wsu:Created>2007-04-09T09:11:05.593Z</wsu:Created>

            </wsse:UsernameToken>

        </wsse:Security>

    </soap:Header>

    <soap:Body>

        <getRefinedTopicCount

            xmlns="http://server.xfire.baobaotao.com">

            <in0 xmlns="http://server.xfire.baobaotao.com">20</in0>

        </getRefinedTopicCount>

    </soap:Body>

</soap:Envelope>

报文中粗体的部分为WS-Security的信息,为了简洁,我们特意删除了报文中一些命名空间的内容。

<wsse:UsernameToken>元素被导入到SOAP报头中以携带身份信息。wsse:Username用于指定一个用户名,而<wsse:Password>则用于指定密码。有两种类型的密码:PasswordText和PasswordDigest,PasswordText以明文格式表示密码,而PasswordDigest则被定义为Base64编码的SHA-1散列值。还有两个可选元素<wsse:Nonce>和<wsu:Created>:前者是发送方创建的一个随机值,后者则是一个时间戳。如果<wsse:Nonce>和<wsu:Created>两个元素中至少出现了一个,计算PasswordDigest的算法如下(每次PasswordDigest的值都是不一样的):

PasswordDigest = Base64(SHA-1(nonce+created+password))

如果没有使用其他的安全机制,PasswordDigest是通过非保密渠道发送用户名和口令的最佳方法。即使使用XML加密对<wsse:Password>元素进行加密,PasswordText依然可以使用。

 

3.client:

 

import java.lang.reflect.Proxy;
import java.net.MalformedURLException;
import java.util.Properties;

import org.apache.ws.security.WSConstants;
import org.apache.ws.security.handler.WSHandlerConstants;
import org.codehaus.xfire.client.Client;
import org.codehaus.xfire.client.XFireProxy;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.demo.Book;
import org.codehaus.xfire.demo.BookService;
import org.codehaus.xfire.demo.IBook;
import org.codehaus.xfire.demo.PasswordHandler;
import org.codehaus.xfire.security.wss4j.WSS4JOutHandler;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
import org.codehaus.xfire.util.dom.DOMOutHandler;

public class Test {

 private static XFireProxyFactory serviceFactory=new XFireProxyFactory();
 void test(){
  Service serviceModel=new ObjectServiceFactory().create(IBook.class);
  String serviceURL="http://localhost:8080/spring2.5-xfire/service/IBook";
  try {
   IBook service=(IBook)serviceFactory.create(serviceModel,serviceURL);
   Client client=((XFireProxy)Proxy.getInvocationHandler(service)).getClient();
   client.addOutHandler(new DOMOutHandler());
   Properties properties=new Properties();
   properties.setProperty(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
   properties.setProperty(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
   properties.setProperty(WSHandlerConstants.PW_CALLBACK_CLASS, PasswordHandler.class.getName());
   properties.setProperty(WSHandlerConstants.USER, "0123456789");
   client.addOutHandler(new WSS4JOutHandler(properties));
   System.out.println("----");
   Book b=service.findBook("0123456789");
   System.out.println(b.getAuthor()+" *******");
  } catch (MalformedURLException e) {
   e.printStackTrace();
  }
 }
 public static void main(String[] args) {  

  Test t=new Test();
  t.test();
     } 
}

 

4.服务端:

<bean id="bookService" class="org.codehaus.xfire.demo.BookService"></bean>
 <!--BookService 基类-->
    <bean id="baseWebService" class="org.codehaus.xfire.spring.remoting.XFireExporter" abstract="true">
        <property name="serviceFactory" ref="xfire.serviceFactory"/>
        <property name="xfire" ref="xfire"/>
    </bean>

    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <value>
                /BookService=bookService
                /BookServiceWSS4J=bookServiceWSS4J
               <!--   /BookServiceWSS4JEnc=bookServiceWSS4JEnc
                /BookServiceWSS4JSign=bookServiceWSS4JSign-->
            </value>
        </property>
    </bean>
 
 <!--  (3)BookWebService 使用 WSS4J验证-->
    <bean id="bookServiceWSS4J" class="org.codehaus.xfire.spring.remoting.XFireExporter">
        <property name="serviceBean" ref="bookService"/>
        <property name="serviceClass" value="org.codehaus.xfire.demo.IBook"/>
        <property name="inHandlers">
            <list>
                <ref bean="domInHandler"/>
                <ref bean="wss4jInHandler"/>
               <!--  <ref bean="validateUserTokenHandler"/> -->
            </list>
        </property>
    </bean>

    <bean id="domInHandler" class="org.codehaus.xfire.util.dom.DOMInHandler"/>

    <bean id="wss4jInHandler" class="org.codehaus.xfire.security.wss4j.WSS4JInHandler">
        <property name="properties">
            <props>
                <prop key="action">UsernameToken</prop>
                <prop key="passwordCallbackClass">org.codehaus.xfire.demo.PasswordHandler</prop>
            </props>
        </property>
    </bean>

    <bean id="validateUserTokenHandler" class="org.codehaus.xfire.demo.ValidateUserTokenHandler"/>

 

4.handler:

public class PasswordHandler implements CallbackHandler {

 private Map passwords = new HashMap();

 public PasswordHandler() {
  passwords.put("serveralias", "aliaspass");
        passwords.put("client-344-839","client344Password");
        passwords.put("0123456789", "pass");
 }

 public void handle(Callback[] callbacks) throws IOException,
   UnsupportedCallbackException {
  
  WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
  String id = pc.getIdentifer();
  pc.setPassword((String) passwords.get(id)); //没有这个会报异常
  System.out.println("handle: "+pc.getIdentifer()+"  ----password: "+pc.getPassword());
 }

}

分享到:
评论
1 楼 yonghuuser 2011-03-26  
运行代码清单16-12,通过类似于TcpTrace的工具截取SOAP请求报文,用户将可以看到带WS-Security报文头的SOAP报文:
为什么我就没有截获到这个报文呢?我的QQ是362158294

相关推荐

    xfire+spring实现ws-security(数字签名和报文加密)

    eclipse下spring+xfire实现ws-security的简单例子,包含服务器和客户端的代码,实现用户名/密码.数字签名和报文加密的安全认证,唯一不足的是没有实现数字签名和报文加密的混合模式(可能是密匙文件的问题,正在努力中),...

    xfire+spring+安全认证

    其次,XFire可以配置为只接受经过Spring Security认证的请求,这样可以确保只有合法的客户端才能访问服务。 在实际操作中,我们可能需要以下步骤: 1. 配置Spring Security:定义用户、角色和权限,设置认证和授权...

    Spring+xFire+wss4j配置Helloworld完整版,Myeclipse项目服务端+客户端.rar

    在本教程中,我们将深入探讨如何使用Spring框架与xFire集成,同时利用wss4j进行WS-Security安全配置,创建一个"Hello World"的Web服务。这是一个完整的MyEclipse项目,包括服务端和客户端的工程,旨在帮助开发者快速...

    Spring+xFire+wss4j配置Helloworld完整Demo.rar

    标题中的"Spring+xFire+wss4j配置Helloworld完整Demo"揭示了这是一个关于整合Spring框架、xFire(现称为Apache CXF)和WSS4J的安全Web服务示例项目。这个项目旨在帮助开发者理解如何在Spring环境中配置并实现一个...

    Webservice实现WS-Security(XFire)

    NULL 博文链接:https://zhaoshijie.iteye.com/blog/839050

    xfire+spring

    XFire的核心功能包括自动代码生成、XML编解码器、协议支持(如SOAP、RESTful)以及WS-*规范的实现,如WS-Security。这使得开发者能够快速地创建安全、可靠的Web服务。Spring框架则以其依赖注入(Dependency ...

    xfire spring security

    《xfire与Spring Security整合实现WS-Security安全认证详解》 在现代企业级应用开发中,安全性是不可或缺的重要环节。Spring Security作为Java领域的安全框架,提供了全面的身份验证和授权服务。而Xfire(现已被...

    xfire+spring+webservice+client

    标题中的“xfire+spring+webservice+client”是一个关于集成XFire、Spring框架和Web服务客户端的专题,这涉及到Java开发中的一项重要技术——Web服务的消费与提供。在这个主题下,我们将深入探讨以下几个核心知识点...

    Xfire整合webservice jar包

    支持多种Web服务业界重要标准如SOAP、WSDL、Web服务寻址(WS-Addressing)、Web服务安全(WS-Security)等; 支持JSR181,可以通过JDK5配置Web服务; 高性能的SOAP实现; 服务器端、客户端代码辅助生成; 对Spring、...

    xfire-distribution-1.2.3

    4. **广泛的协议支持**: XFire 支持 SOAP 1.1 和 1.2,WS-Security,WS-Addressing 等多种 Web 服务标准,以及 JAXB 和 JiBX 等数据绑定技术。 5. **Aegis Databinding**: XFire 自带的 Aegis 数据绑定引擎,能够...

    Spring+cxf请求webService

    Spring+CXF支持基本认证、证书认证、WS-Security等安全方案,确保数据传输的安全性。 总结,Spring+CXF组合提供了强大且灵活的Web服务客户端实现方式,尤其在处理XML格式的数据时。通过合理的配置和编程,可以高效...

    xfire+spring+webservice

    XFire支持多种协议,如HTTP、JMS等,并且能够处理WS-*标准,如WS-Security、WS-ReliableMessaging等,使得开发人员能够轻松创建符合WS-I Basic Profile的Web服务。 Spring框架,以其依赖注入和面向切面编程的核心...

    spring-xfire编写webservice

    - 详细讲解如何在Spring中通过XFire实施WS-Security,这是一种标准的安全框架,用于保护Web Service免受攻击,包括身份验证、授权和数据完整性等安全措施。 7. **XFire体系结构**: - 简明扼要地介绍了XFire的...

    Spring和XFIRE结合

    XFire提供了快速、简单且灵活的方式去实现Web服务,支持WS-*规范,如WSDL、SOAP、WS-Security等。XFire后来成为了Apache CXF的一部分,后者是一个更强大、更成熟的Web服务框架,继承并扩展了XFire的功能。 **Spring...

    xfire访问webservice客户端用到的jar包

    XFire是Apache CXF项目的前身,它提供了全面的Web服务支持,包括SOAP 1.1和1.2、WSDL(Web服务描述语言)、UDDI(统一描述、发现和集成)和WS-Security等。XFire的核心特性在于其轻量级、高性能和易于使用的API,...

    xfire-distribution-1.2.6.rar

    10. **安全性**:虽然XFire 1.2.6不包含Xalan,但它支持WS-Security标准,可以实现基于SOAP消息的安全认证和加密。 在"lib"目录下,通常会包含XFire运行所需的JAR文件,如XFire的核心库、依赖的XML解析器、JAXB实现...

    Spring应用开发实战Web Service WS

    1. **Spring支持的远程访问技术**:Spring框架支持多种远程访问技术,包括RMI(Remote Method Invocation)、JAX-RPC(Java API for XML-based Remote Procedure Call)、Hessian、Burlap、XFire以及Spring自带的...

    xfire+spring+webservice入门例子

    【xfire+Spring+WebService 入门实例详解】 在IT行业中,Web服务是一个重要的通信方式,它允许不同系统间的应用程序进行数据交换。本入门实例将深入探讨如何使用XFire框架与Spring集成来构建和消费Web服务。XFire是...

    使用xfire框架搭建webService的一个demo

    本示例将详细解释如何利用xfire框架搭建一个包含SOAP Header身份验证和WS-Security身份验证的Web Service。 首先,让我们了解`xfire`。Xfire(现为Apache CXF的一部分)是一个开源的Java框架,它简化了创建和使用...

Global site tag (gtag.js) - Google Analytics