`

cxf webservice接口 实现安全验证

    博客分类:
  • cxf
cxf 
阅读更多

 

   基于 spring + apache cxf

 

1.服务器端 cxf配置:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

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

xmlns:jaxws="http://cxf.apache.org/jaxws"

xmlns:jaxrs="http://cxf.apache.org/jaxrs"

xsi:schemaLocation="

 http://www.springframework.org/schema/beans 

 http://www.springframework.org/schema/beans/spring-beans.xsd 

 http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd

 http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">

 

    <import resource="classpath:META-INF/cxf/cxf.xml" />  

    <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />  

    

<jaxws:endpoint id="greetingService"

implementor="com.test.service.impl.GreetingServiceImpl" 

address="/greetingService" >

<jaxws:inInterceptors>   

            <bean   

                class="org.apache.cxf.interceptor.LoggingInInterceptor" />   

            <bean   

                class="org.apache.cxf.binding.soap.saaj.SAAJInInterceptor" />   

            <bean   

                class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor">   

                <constructor-arg>   

                    <map>   

                        <entry key="action" value="UsernameToken" />   

                        <entry key="passwordType"  

                            value="PasswordText" />   

                        <entry key="user" value="cxfUser" />   

                        <entry key="passwordCallbackRef">   

                            <ref bean="serverPasswordCallback" />   

                        </entry>   

                    </map>   

                </constructor-arg>   

            </bean>   

        </jaxws:inInterceptors>   

    </jaxws:endpoint>

<bean id="serverPasswordCallback"  

       class="com.common.cxf.ServerPasswordCallback" />   

</beans> 

说明:

   action:UsernameToken指使用用户令牌 
    passwordType:PasswordText指密码加密策略,这里直接文本 
    user:cxfServer指别名 
    passwordCallBackRef:serverPasswordCallback指消息验证 

 

2.服务器端 CallbackHandler 拦截处理

package com.core.common.cxf;

 

import java.io.IOException;   

  

import javax.security.auth.callback.Callback;   

import javax.security.auth.callback.CallbackHandler;   

import javax.security.auth.callback.UnsupportedCallbackException;   

 

import org.apache.wss4j.common.ext.WSPasswordCallback;

  

  

public class ServerPasswordCallback implements CallbackHandler {   

  

    public void handle(Callback[] callbacks) throws IOException,   

            UnsupportedCallbackException {   

        WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];   

        String pw = pc.getPassword();   

        String idf = pc.getIdentifier();   

        System.out.println("password:"+pw);   

        System.out.println("identifier:"+idf);   

        if (idf.equals("admin")) {   

        pc.setPassword("josen");

        } else {   

            throw new SecurityException("验证失败");   

        }   

    }   

  

 

}  

说明:

 

  WSPasswordCallback 的passwordType属性和password 属性都为null,你只能获得用户名(identifier),一般这里的逻辑是使用这个用户名到数据库中查询其密码,然后再设置到password 属性,WSS4J 会自动比较客户端传来的值和你设置的这个值。你可能会问为什么这里CXF 不把客户端提交的密码传入让我们在ServerPasswordCallbackHandler 中比较呢?这是因为客户端提交过来的密码在SOAP 消息中已经被加密为MD5 的字符串,如果我们要在回调方法中作比较,那么第一步要做的就是把服务端准备好的密码加密为MD5 字符串,由于MD5 算法参数不同结果也会有差别,另外,这样的工作CXF 替我们完成不是更简单吗?

 

根据上面说的,我获取的password 为null,所以这里就不用自己判断密码了,只要验证用户名后,在设置密码就可以自动验证了

3.客户端配置文件:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

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

xmlns:jaxws="http://cxf.apache.org/jaxws"

xmlns:jaxrs="http://cxf.apache.org/jaxrs"

xsi:schemaLocation="

 http://www.springframework.org/schema/beans 

 http://www.springframework.org/schema/beans/spring-beans.xsd 

 http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd

 http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd">

 

  <jaxws:client id="greetingService" serviceClass="com.test.service.GreetingService" 

  address="http://localhost:8080/test/greetingService">

 

          <jaxws:outInterceptors>   

            <bean   

                class="org.apache.cxf.interceptor.LoggingOutInterceptor" />   

            <bean   

                class="org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor" />   

            <bean   

                class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">   

                <constructor-arg>   

                    <map>   

                        <entry key="action" value="UsernameToken" />   

                        <entry key="passwordType"  

                            value="PasswordText" />   

                        <entry key="user" value="cxfUser" />   

                        <entry key="passwordCallbackRef">   

                            <ref bean="clientPasswordCallback" />   

                        </entry>   

                    </map>   

                </constructor-arg>   

            </bean>   

        </jaxws:outInterceptors> 

    </jaxws:client>   

    <bean id="clientPasswordCallback"  

        class="com.common.cxf.ClientPasswordCallback" />   

 

</beans> 

4.客户端CallbackHandler

package com.common.cxf;

 

import java.io.IOException;   

 

import javax.security.auth.callback.Callback;   

import javax.security.auth.callback.CallbackHandler;   

import javax.security.auth.callback.UnsupportedCallbackException;   

 

import org.apache.wss4j.common.ext.WSPasswordCallback;

  

 

  

public class ClientPasswordCallback implements CallbackHandler {   

  

    public void handle(Callback[] callbacks) throws IOException,   

            UnsupportedCallbackException {   

        for(int i=0;i<callbacks.length;i++)   

        {   

             WSPasswordCallback pc = (WSPasswordCallback)callbacks[i];   

             pc.setPassword("josen");   

             pc.setIdentifier("admin");   

        }   

    }   

  

 

}  

    说明:

  只要两边的 Identifier,Password 相同就ok了

  

分享到:
评论

相关推荐

    CXF webservice 验证码接口

    使用jdk1.6、cxf2.3和tomcat开发的一个关于验证码的webservice接口,主要实现对手机验证码的验证。

    使用cxf的webservice安全验证

    标题“使用CXF的Web服务安全验证”提示我们关注的重点是通过CXF实现Web服务的安全配置。CXF提供了多种方式来实现这一目标,例如使用Spring配置文件或Java代码来设置安全策略。 1. **基本认证**:这是最简单的身份...

    纯java调用ws-security+CXF实现的webservice安全接口

    本文将深入探讨如何使用CXF框架结合ws-security标准来实现对Java客户端调用Web服务的安全接口。CXF是一个开源的服务框架,它允许开发人员创建和消费各种Web服务,而ws-security(Web Services Security)则是用于...

    spring+CXF实现WebService(http+https)

    在Spring配置文件中,可以通过`&lt;jaxws:endpoint&gt;`标签来声明一个CXF Web服务,指定服务接口、实现类以及服务地址。 3. **HTTPS支持**: HTTPS是一种安全的通信协议,它在HTTP基础上增加了SSL/TLS层,用于加密传输...

    CXF webService 接口

    **CXF WebService接口基础** 1. **服务提供者接口(SPI)**:CXF使用JAX-WS(Java API for XML Web Services)服务提供者接口来创建Web服务。开发者可以通过实现`javax.jws.WebService`注解的类来定义服务端点。 2...

    cxf做的webservice对外提供接口调用

    【标题】:“cxf做的webservice对外提供接口调用” 【描述】中提到的“webservice对外发布接口全部源码拿起来就能用”,这表明这是一个关于使用Apache CXF框架创建和发布的Web服务项目。Apache CXF是一个开源的Java...

    cxf webservice restful实现

    - 使用CXF的WS-Security功能,可以实现安全验证,如OAuth、基本认证等。 - 利用CXF的测试工具,如CXFTestSupport,可以方便地进行服务端和客户端的集成测试。 - 使用Postman等工具,可以模拟客户端对服务端的HTTP...

    mybatis+spring+cxf Webservice框架

    这可能是整个项目的根目录,里面可能包含了配置文件(如Spring的配置XML、CXF的wsdl或xsd文件)、MyBatis的Mapper接口和XML配置、实体类、服务接口和服务实现类、以及可能的测试代码。这些文件将详细展示如何在实际...

    webService(基于cxf)的完整例子

    总结来说,基于CXF的Web服务示例提供了一个完整的流程,从创建服务接口、实现服务逻辑、配置服务到测试服务,涵盖了Web服务开发的各个方面。通过学习这个例子,开发者可以掌握CXF的基本使用方法,进一步拓展到更复杂...

    cxf webservice 文件分块上传

    根据提供的博文链接,我们可能无法直接获取具体细节,但可以推测讨论的内容可能涉及到以下方面:通过CXF Webservice接口设计一个能够接收并合并分块文件的系统。这个系统可能涉及到客户端将大文件分割成多个小块,...

    CXF webservice 示例工程(集成spring)

    本示例工程是基于CXF框架构建的一个Webservice应用,该应用集成了Spring框架,以实现更高效的服务管理和依赖注入。CXF是一个开源的Web服务框架,它允许开发者创建和部署SOAP和RESTful服务,同时也支持WS-*标准,如...

    CXF WebService实例

    例如,你可以配置CXF来实现基于证书的身份验证、消息加密和签名,以增强Web服务的安全性。对于性能,CXF允许你调整缓存策略、启用HTTP连接池等,以提高服务响应速度。 总的来说,CXF是一个强大的工具,它简化了Java...

    WebService CXF --- 传输文件MTOM

    总的来说,通过CXF框架实现MTOM,开发者可以提高Web服务中大文件传输的效率,降低网络负载,同时需要关注安全性、性能优化和测试环节,确保服务稳定可靠。了解并熟练掌握MTOM在CXF中的应用,对于提升Web服务的质量和...

    Springboot整合CXF发布Web service和客户端调用(用户和密码验证)

    接着,实现这个接口,提供具体的服务逻辑: ```java @Service public class UserServiceImpl implements UserService { @Override public User getUserInfo(String username, String password) { // 这里添加...

    Apache CXF2+Spring2.5轻松实现WebService

    Apache CXF和Spring提供了丰富的扩展点,可以集成如Spring Security来控制访问权限,使用Spring AOP来处理事务,以及通过CXF的拦截器机制来实现自定义的日志、验证等功能。 总结来说,Apache CXF 2与Spring 2.5的...

    CXF V3.2.4 实现的WebService调用(带安全认证)

    在本文中,我们将深入探讨如何使用Apache CXF V3.2.4实现带有安全认证的Web服务调用。Apache CXF是一个开源框架,它允许开发者创建和消费各种Web服务,包括SOAP和RESTful API。CXF 3.2版本引入了许多增强功能,包括...

    CXF实现webService

    “testWebService”可能是一个测试类或者测试工程,用于验证CXF Web服务的正确性和功能。 总结,Apache CXF 提供了一个强大且灵活的平台来实现Web服务,无论是服务端的构建还是客户端的调用,都提供了便捷的方法。...

    cxf webService简单例子

    通常,这样的教程会包括设置开发环境、创建服务接口、实现服务类、配置CXF以及运行和测试服务的步骤。此外,可能会涉及WSDL(Web服务描述语言)的概念,它是定义Web服务接口的标准语言。 【标签】"源码"和"工具...

    CXF开发webservice服务端

    ### CXF 开发 WebService 服务端详解 #### 一、引言 随着企业级应用对服务化的不断追求,Web Service 成为了实现不同系统间通信的重要手段之一。Apache CXF 是一个高性能、易于使用的框架,它支持多种协议,如SOAP...

    spring-cxf WebService

    【Spring-CXF WebService】是基于Spring框架和Apache CXF实现的一个Web服务示例,它展示了如何在Spring环境中集成CXF来创建、部署和消费Web服务。Spring-CXF结合了Spring的强大功能和CXF的优秀Web服务支持,使得开发...

Global site tag (gtag.js) - Google Analytics