- 浏览: 1225324 次
- 性别:
- 来自: 广州
博客专栏
-
Apache CXF使用s...
浏览量:111297
文章分类
- 全部博客 (189)
- Spring (13)
- Hibernate (10)
- liferay portal (3)
- Java (18)
- 数据库 (32)
- JS (12)
- Eclipse (16)
- Log4j (3)
- 我的收藏夹 (8)
- FF and IE (2)
- Groovy Grails (0)
- Web Service (16)
- Quartz (6)
- Tomcat (8)
- Linux (4)
- xml (4)
- Silverlight (1)
- Flex (10)
- JBoss (4)
- EJB (2)
- WAS(webSphere) (5)
- DOS命令 (2)
- JSON (2)
- Maven (1)
- OThers (1)
- SVN (1)
- iBatis (4)
- OS (1)
- 问题解决 (8)
- 待看文章 (2)
- 多线程 (2)
- 代码收藏(即拿即用工具类) (5)
- Socket (2)
- Android (4)
- 其他 (1)
- python (1)
- Genymotion (1)
最新评论
-
a807966224:
还是 多谢楼主 总结的挺好的 !!!
CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用) -
a807966224:
然后 通过 SOAPMessage.getHeader(qna ...
CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用) -
a807966224:
我也是接触这东西不久,QName qname = new QN ...
CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用) -
a807966224:
楼主 不知道你有没有出现 从headers 里取出来长 ...
CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用) -
xdc0209:
兄弟呀,报错啦 2011-12-15 13:27:15 n ...
Hibernate+EhCache配置二级缓存
CXF 入门:创建一个基于WS-Security标准的安全验证(CXF回调函数使用,)
- 博客分类:
- Web Service
注意:以下客户端调用代码中获取服务端ws实例,都是通过CXF 入门: 远程接口调用方式实现
直入正题!
以下是服务端配置
========================================================
一,web.xml配置,具体不在详述
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <context-param> <param-name>contextConfigLocation</param-name> <!--ws-context.xml(必须)是cxf配置文件, wssec.xml可选,作用可以打印出加密信息类容 --> <param-value>WEB-INF/ws-context.xml,WEB-INF/wssec.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <servlet> <servlet-name>CXFServlet</servlet-name> <display-name>CXF Servlet</display-name> <servlet-class> org.apache.cxf.transport.servlet.CXFServlet </servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> </web-app>
二,ws具体代码
简单的接口
import javax.jws.WebService; @WebService() public interface WebServiceSample { String say(String name); }
接口具体实现类
public class WebServiceSampleImpl implements WebServiceSample { public String say(String name) { return "你好," + name; } }
三,ws回调函数,必须实现javax.security.auth.callback.CallbackHandler
从cxf2.4.x后校验又cxf内部实现校验,所以不必自己校验password是否相同,但客户端必须设置,详情请参考:http://cxf.apache.org/docs/24-migration-guide.html的Runtime Changes片段
回调函数WsAuthHandler代码,校验客户端请求是否合法 ,合法就放行,否则拒绝执行任何操作
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.cxf.interceptor.Fault; import org.apache.ws.security.WSPasswordCallback; import org.apache.xmlbeans.impl.soap.SOAPException; public class WsAuthHandler implements CallbackHandler { public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { for (int i = 0; i < callbacks.length; i++) { WSPasswordCallback pc = (WSPasswordCallback) callbacks[i]; String identifier = pc.getIdentifier(); int usage = pc.getUsage(); if (usage == WSPasswordCallback.USERNAME_TOKEN) {// 密钥方式USERNAME_TOKEN // username token pwd... // ▲这里的值必须和客户端设的值相同,从cxf2.4.x后校验方式改为cxf内部实现校验,不必自己比较password是否相同 // 请参考:http://cxf.apache.org/docs/24-migration-guide.html的Runtime // Changes片段 pc.setPassword("testPassword");// ▲【这里非常重要】▲ // ▲PS 如果和客户端不同将抛出org.apache.ws.security.WSSecurityException: // The // security token could not be authenticated or // authorized异常,服务端会认为客户端为非法调用 } else if (usage == WSPasswordCallback.SIGNATURE) {// 密钥方式SIGNATURE // set the password for client's keystore.keyPassword // ▲这里的值必须和客户端设的值相同,从cxf2.4.x后校验方式改为cxf内部实现校验,不必自己比较password是否相同; // 请参考:http://cxf.apache.org/docs/24-migration-guide.html的Runtime // Changes片段 pc.setPassword("testPassword");// //▲【这里非常重要】▲ // ▲PS:如果和客户端不同将抛出org.apache.ws.security.WSSecurityException:The // security token could not be authenticated or // authorized异常,服务端会认为客户端为非法调用 } //不用做其他操作 } } }
四,CXF配置ws-context.xml:
<?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" 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"> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <!-- 以上未基本配置,必须,位置在cxf jar中 --> <jaxws:endpoint id="webServiceSample" address="/WebServiceSample" implementor="com.service.impl.WebServiceSampleImpl"> <!--inInterceptors表示被外部调用时,调用此拦截器 --> <jaxws:inInterceptors> <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="action" value="UsernameToken Timestamp" /> 设置密码类型为加密<entry key="passwordType" value="PasswordDigest" /> --> <entry key="passwordCallbackClass" value="com.service.handler.WsAuthHandler" /> </map> </constructor-arg> </bean> </jaxws:inInterceptors> </jaxws:endpoint> </beans>
CXF配置wssec.xml(可选),用于配置输出校验的具体信息
<?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:cxf="http://cxf.apache.org/core" xmlns:wsa="http://cxf.apache.org/ws/addressing" xmlns:http="http://cxf.apache.org/transports/http/configuration" xmlns:wsrm-policy="http://schemas.xmlsoap.org/ws/2005/02/rm/policy" xmlns:wsrm-mgr="http://cxf.apache.org/ws/rm/manager" xsi:schemaLocation=" http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd http://schemas.xmlsoap.org/ws/2005/02/rm/policy http://schemas.xmlsoap.org/ws/2005/02/rm/wsrm-policy.xsd http://cxf.apache.org/ws/rm/manager http://cxf.apache.org/schemas/configuration/wsrm-manager.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <cxf:bus> <cxf:features> <cxf:logging /> <wsa:addressing /> </cxf:features> </cxf:bus> </beans>
服务端代码及配置到此结束!!!
=========================================================
=========================================================
以下是客户端配置,主要是回调函数,在客户端调用服务端前被调用,负责安全信息的设置
----------------------------------------------------------------------------------------
一,先实现回调函数WsClinetAuthHandler,同样必须实现javax.security.auth.callback.CallbackHandler
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.ws.security.WSPasswordCallback; public class WsClinetAuthHandler implements CallbackHandler { public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { for (int i = 0; i < callbacks.length; i++) { WSPasswordCallback pc = (WSPasswordCallback) callbacks[i]; System.out.println("identifier: " + pc.getIdentifier()); // 这里必须设置密码,否则会抛出:java.lang.IllegalArgumentException: pwd == null // but a password is needed pc.setPassword("testPassword");// ▲【这里必须设置密码】▲ } } }
二,客户端调用代码:
import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor; import org.apache.cxf.jaxws.JaxWsProxyFactoryBean; import org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor; import org.apache.ws.security.WSConstants; import org.apache.ws.security.handler.WSHandlerConstants; import test.saa.client.WebServiceSample; import test.saa.handler.WsClinetAuthHandler; public class TestClient { public static void main(String[] args) { // 以下和服务端配置类似,不对,应该说服务端和这里的安全验证配置一致 Map<String, Object> outProps = new HashMap<String, Object>(); outProps.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN); outProps.put(WSHandlerConstants.USER, "admin"); outProps.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT); // 指定在调用远程ws之前触发的回调函数WsClinetAuthHandler,其实类似于一个拦截器 outProps.put(WSHandlerConstants.PW_CALLBACK_CLASS, WsClinetAuthHandler.class.getName()); ArrayList list = new ArrayList(); // 添加cxf安全验证拦截器,必须 list.add(new SAAJOutInterceptor()); list.add(new WSS4JOutInterceptor(outProps)); JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean(); // WebServiceSample服务端接口实现类,这里并不是直接把服务端的类copy过来,具体请参考http://learning.iteye.com/blog/1333223 factory.setServiceClass(WebServiceSample.class); // 设置ws访问地址 factory.setAddress("http://localhost:8080/cxf-wssec/services/WebServiceSample"); //注入拦截器,用于加密安全验证信息 factory.getOutInterceptors().addAll(list); WebServiceSample service = (WebServiceSample) factory.create(); String response = service.say("2012"); System.out.println(response); } }
客户端到此结束!!!!
========================================================================
#######################################################################
PS:客户端的另一种调用方式,主要通过配置文件,不过需要spring bean的配置文件(第一种就不用牵扯到spring的配置,比较通用吧!)
一,回调函数WsClinetAuthHandler不变,和上面一样
二,client-beans.xml安全验证配置文件,具体信息看注释,如下:
<?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" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schema/jaxws.xsd"> <!--这里无非是通过配置来替代JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean()创建代理并实例化一个ws--> <bean id="client" class="test.saa.client.WebServiceSample" factory-bean="clientFactory" factory-method="create" /> <!-- 通过代理创建ws实例 --> <bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean"> <property name="serviceClass" value="test.saa.client.WebServiceSample" /> <!-- ws地址,也可以是完整的wsdl地址 --> <property name="address" value="http://localhost:8080/cxf-wssec/services/WebServiceSample" /> <!--outInterceptors表示调用外部指定ws时,调用此拦截器 --> <property name="outInterceptors"> <list> <bean class="org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor" /> <ref bean="wss4jOutConfiguration" /> </list> </property> </bean> <bean id="wss4jOutConfiguration" class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor"> <property name="properties"> <map> <!-- 设置加密类型 ,服务端需要和这里的设置保持一致--> <entry key="action" value="UsernameToken" /> <entry key="user" value="admin" /> <!-- 设置密码为明文 ,服务端需要和这里的设置保持一致--> <entry key="passwordType" value="PasswordText" /> <!-- <entry key="action" value="UsernameToken Timestamp" /> <entry key="user" value="adminTest" /> 设置密码类型为加密方式,服务端需要和这里的设置保持一致<entry key="passwordType" value="PasswordDigest" /> --> <entry key="passwordCallbackRef"> <ref bean="passwordCallback" /> </entry> </map> </property> </bean> <bean id="passwordCallback" class="test.saa.handler.WsClinetAuthHandler" /> </beans>
三,具体调用服务端代码:
import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import test.saa.client.WebServiceSample; public final class Client { public static void main(String args[]) throws Exception { //加载配置 ApplicationContext context = new ClassPathXmlApplicationContext( new String[] { "test/saa/client-beans.xml" }); //获取ws实例 WebServiceSample client = (WebServiceSample) context.getBean("client"); String response = client.say("2012"); System.out.println("Response: " + response); } }
到此客户端第二种实现方式结束
GOOD LUCKY!!!
如有不明,请指教!!!
评论
6 楼
wentao_tang
2013-12-02
客户端调用,这行代码是必须的吗,有什么作用吗?
outProps.put(WSHandlerConstants.USER, "admin");
outProps.put(WSHandlerConstants.USER, "admin");
5 楼
xiangximingong
2013-09-18
我想问下,就是客户端传入错误的密码,也会抛一个异常,但这个异常我不知道在哪捕获,也不知道怎么通知客户端密码错误!能否指教下……
4 楼
zhenglongfei
2013-07-25
想不通,为什么要在服务端要在set一下呢??
3 楼
Sev7en_jun
2012-12-06
ice.kane 写道
zl759869747 写道
我想问下,为什么在服务端的回调函数里面当还要setPassword呢?我很郁闷的是,我在客户端明明已经设定了密码,可是服务端却拿不到,而且如果有服务端不设定密码就抛异常,我想问下到底是怎么样校验的呢?
我也是遇到这个问题。。
在服务端setPassword,那密码校验还有什么意义
1,为什么不设置密码会抛异常:
--既然要把服务加密,就要设置密码,要不然怎么加密,怎么知道哪些客户端是有权限访问的,就像买了一把锁,连自己(服务端)都不知道钥匙是怎么,那别人(客户端)怎么开这把锁
2,服务端设置密码是为了给自己上一把锁,如果要访问它必须有开这把锁的钥匙,即密码,有钥匙还要保证这个钥匙可以开这把锁,即客户端拿的密码是否和服务端锁的密码一致
2 楼
ice.kane
2012-11-27
zl759869747 写道
我想问下,为什么在服务端的回调函数里面当还要setPassword呢?我很郁闷的是,我在客户端明明已经设定了密码,可是服务端却拿不到,而且如果有服务端不设定密码就抛异常,我想问下到底是怎么样校验的呢?
我也是遇到这个问题。。
在服务端setPassword,那密码校验还有什么意义
1 楼
zl759869747
2012-10-23
我想问下,为什么在服务端的回调函数里面当还要setPassword呢?我很郁闷的是,我在客户端明明已经设定了密码,可是服务端却拿不到,而且如果有服务端不设定密码就抛异常,我想问下到底是怎么样校验的呢?
发表评论
-
解决(CXF):The security token could not be authenticated or authorized
2012-01-16 09:50 48181,使用cxf回调函数,服务端setPassword和客 ... -
CXF 入门:创建一个基于SOAPHeader的安全验证(CXF拦截器使用)
2012-01-12 18:23 18789CXF 入门:HelloWorld接口发布 CXF 入门: ... -
解决(CXF):SOAPFaultException: Fault occurred while processing
2012-01-04 17:23 22766javax.xml.ws.soap.SOAPFault ... -
CXF 入门: 远程接口调用
2012-01-02 17:15 7952本篇是接着:CXF 入门之接口发布写的,建议先看上篇 ... -
CXF 入门:HelloWorld接口发布
2012-01-02 16:31 6276第一步:在myeclipse中新建一个web项目名为myWs, ... -
使用XFire+Spring构建Web Service
2011-12-01 12:01 1750FROM: http://shuangjianyu.blog. ... -
使用XFire+Spring+Struts构建Web Service及测试
2011-11-30 13:04 2652FROM: http://shade8109.blog.1 ... -
Apache Axis配置文件WSDD详解
2011-11-30 12:37 26236FROM: http://apps.hi.baidu.co ... -
(Axis 入门) 超简单webservice实例
2011-11-30 11:21 2132From: http://user.qzone.qq.com/ ... -
解决:nor any of its super class is known to this context.
2011-10-26 13:38 17929可以参考http://blog.csdn.net/chen_y ... -
WebService CXF学习(进阶篇3):CXF整合Spring框架 .
2011-10-26 13:28 79转载于:http://blog.csdn.net/chen ... -
WebService CXF学习 自定义对象传递(简单JavaBean对象) ..
2011-10-26 13:25 91这一节我们就CXF框架简单的JavaBean对象传递进行讲解。 ... -
WebService处理复杂对象List Map(jdk api jws)
2011-10-26 13:02 8739XFire不用这么做,Apache CXF 只需要指定集合中具 ... -
解决: is not found. Have you run APT to generate them?
2011-10-25 13:15 31744WSSERVLET11: failed to parse ru ... -
WebServices CXF开发常见异常及解决方法
2011-10-25 13:08 3572转载于:http://apps.hi.baidu.com/ ... -
解决:java.util.List does not have a no-arg default constructor.
2011-10-25 13:05 3084详见:http://learning.iteye.com/ad ... -
解决: counts of IllegalAnnotationExceptions and JAXB can't handle interfaces.
2011-10-25 13:02 22226、Caused by: com.sun.xml.bind.v2 ...
相关推荐
CXF是一个开源的服务框架,它允许开发人员创建和消费各种Web服务,而ws-security(Web Services Security)则是用于保护Web服务的标准。 首先,我们要理解ws-security的概念。它是 Oasis Web服务安全技术委员会制定...
1)参考: ...2)CXFWS工程是基于WS-Security规范,实现X.509身份验证的,同时实现签名和加密 keytool 工具的使用参考 http://hi.baidu.com/qianshuifanchuan/blog/item/6291b8510009ad3c42a75b8e.html ...
而Apache WSS4J(Web Services Secure Utilities for Java)则是Apache软件基金会开发的一个实现WS-Security标准的开源库,它为Java开发者提供了处理和验证Web服务消息安全性的工具。 首先,我们来看一下标题提到的...
【描述】该描述指出,这个项目是关于如何使用Apache CXF,一个开源的Java框架,来构建和部署SOAP Web服务,并且结合WS-Security标准进行安全增强。WS-Security(Web Services Security)是一种用于保护Web服务通信的...
这表明示例包含一个CXF客户端,该客户端会向服务端发送带有WS-Security头信息的请求。在实际操作中,可能需要根据示例代码和配置调整客户端的路径,确保其指向正确的服务地址。 5. **关闭第一个控制台**:运行示例...
综上所述,"我的cxf与ws-security"项目是一个关于在Apache CXF中实施WS-Security安全标准的实践,涉及到Web服务的安全配置、策略设定、令牌处理、消息签名和加密等多个环节,通过不断的调试和完善,确保了Web服务的...
【标题】"ws-security jar" 是一个与Web服务安全相关的Java库,主要用于实现Web服务的安全标准,如WS-Security(Web Services Security)。在Web服务的世界里,安全性是至关重要的,因为它们经常涉及到跨网络的数据...
ISNetworksProvider.jar可能是某个特定厂商提供的WS-Security实现或者一个特定的安全提供者,可能包含了对WS-Security规范的某些特定功能的支持,例如证书管理或特定加密算法的实现。 tsik.jar文件名暗示了它可能是...
Web服务规范是一个重要的标准集合,用于定义如何在分布式计算环境中安全地交换数据。这一规范的第4部分,WS-Security(Web Services Security),是其中的关键组件,它专注于提供Web服务的安全性,确保通信过程中的...
证书加密是WS-Security中的一个重要组成部分,它通常使用X.509数字证书来验证服务提供者和服务消费者的标识,并对消息进行加密。X.509证书包含公钥和私钥,公钥用于加密数据,私钥用于解密数据。在CXF中,我们可以...
这个"apache-cxf-2.4.6.zip"压缩包包含了CXF框架的2.4.6版本,这是一个相对早期的版本,发布于2012年。在深入探讨CXF之前,我们先来了解一下什么是Apache CXF。 Apache CXF是一个融合了多个前任项目的综合框架,...
CXF使用WSS4J实现WS-Security规范,本例的配置是Timestamp Signature Encrypt,具体使用可以参考我的博客http://blog.csdn.net/wangchsh2008/article/details/6708270
对于需要安全性的Web服务,如WS-Security,CXF提供了相应的jar包,如`cxf-rt-ws-security.jar`,包含了加密、签名、认证等安全功能。 6. **数据绑定和对象映射**: CXF支持多种数据绑定技术,如JAXB(Java ...
首先,`ws-security`(Web Services Security)是 Oasis Web Services Security Technical Committee 开发的一套标准,用于增强基于SOAP的消息的安全性。它提供了认证、授权、消息完整性以及消息机密性的解决方案。...
3. **CXF**:一个开源框架,支持多种Web服务标准,包括WS-Security。 #### 六、总结 WS-Security规范为Web服务的安全性提供了一个强大的框架,它不仅解决了传统安全机制的局限性,还通过消息完整性和加密等功能...
- **扩展支持**:如cxf-rt-ws-policy.jar、cxf-rt-ws-security.jar等,包含了WS-*扩展的实现。 - **其他依赖库**:还包括了与CXF协同工作的第三方库,如Spring框架、Apache Commons库等。 在实际开发中,根据项目...
Apache CXF 是一个开源项目,提供了一套强大的工具和服务框架,用于构建和开发基于标准的服务(如 Web Services)。本文将详细介绍如何使用 CXF 实现 SSL 安全验证,并在此基础上构建 HTTPS 的 Web Service。 ### ...
- `cxf-rt-ws-security.jar`:包含Web服务安全相关的类。 - `cxf-rt-rs-extension-providers.jar`:用于RESTful服务的扩展提供者。 这些jar包组合在一起,构成了一个完整的CXF运行环境,可以帮助开发者快速构建和...
【cxf-uw-ws-soap】:Apache CXF与SOAP Web服务详解 Apache CXF是一个开源的Java框架,主要用于构建和开发Web服务。在"cxg-uw-ws-soap"这个主题中,我们主要关注的是CXF如何实现基于SOAP(Simple Object Access ...
基于WS-Security的证据服务系统安全方案的实现,平野,高强 ,证据服务系统的核心和关键是交互的安全性。本文从身份认证、保密性、完整性和不可抵赖性方面提出基于WS-Security的证据服务系统安全�