`
zhushidan100
  • 浏览: 29805 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

CXF WS-SECURITY协议对soap消息加密

 
阅读更多

<!-- 服务端代码: -->
<jaxws:endpoint id="userWebService" implementor="#userServiceImpl" 
		address="/userservice">
		<jaxws:inInterceptors>
			<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
			<bean class="org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor" /> 
			<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor" >
				<constructor-arg>
					<map>
						<entry key="action" value="UsernameToken Timestamp" />
						<!-- MD5加密明文密码 -->
                        <entry key="passwordType" value="PasswordDigest" />    
                        <entry key="user" value="admin" />
                        <entry key="passwordCallbackRef" >
                       		<ref bean="serverPasswordCallback" />    
                        </entry>   
					</map>
				</constructor-arg>
			</bean>
		</jaxws:inInterceptors>
		<jaxws:outInterceptors>
			<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>
		</jaxws:outInterceptors>
	</jaxws:endpoint>
	<bean id="serverPasswordCallback" class="com.cxf.webservice.callback.ServerPasswordCallback"></bean>

 com.cxf.webservice.callback.ServerPasswordCallback:

package com.cxf.webservice.callback;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;

import org.apache.log4j.Logger;
import org.apache.ws.security.WSPasswordCallback;

public class ServerPasswordCallback implements CallbackHandler {
	Logger log = Logger.getLogger(ServerPasswordCallback.class);
	
	Map<String, String> user = new HashMap<String, String>();
	{
		user.put("admin", "1234");
		user.put("su", "1234");
	}
	
	@Override
	public void handle(Callback[] callbacks) throws IOException,
			UnsupportedCallbackException {
		log.debug("handler passwordcallback method....");
		WSPasswordCallback wpc = (WSPasswordCallback) callbacks[0];
		if (!user.containsKey(wpc.getIdentifier())) {
			throw new SecurityException("No Permission!");
		}
		/*
		 * 此处特别注意::
		 * WSPasswordCallback 的passwordType属性和password 属性都为null,
		 * 你只能获得用户名(identifier),
		 * 一般这里的逻辑是使用这个用户名到数据库中查询其密码,
		 * 然后再设置到password 属性,WSS4J 会自动比较客户端传来的值和你设置的这个值。
		 * 你可能会问为什么这里CXF 不把客户端提交的密码传入让我们在ServerPasswordCallbackHandler 中比较呢?
		 * 这是因为客户端提交过来的密码在SOAP 消息中已经被加密为MD5 的字符串,
		 * 如果我们要在回调方法中作比较,那么第一步要做的就是把服务端准备好的密码加密为MD5 字符串,
		 * 由于MD5 算法参数不同结果也会有差别,另外,这样的工作CXF 替我们完成不是更简单吗?
		 */
		wpc.setPassword(user.get(wpc.getIdentifier()));//如果包含用户名,就设置该用户名正确密码,由CXF验证密码
		String username = wpc.getIdentifier();
		String password = wpc.getPassword();
		log.debug("username: "+username + "    password: "+password);
		log.info("User : "+wpc.getIdentifier()+ "  login!!!!!");
	}

}

 

 

 

 

<!--客户端配置-->
<bean id="userService" class="webservice.cxf.client.UserService" factory-bean="clientFactory" factory-method="create" />
	<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
		<property name="address" value="http://127.0.0.1:8080/HSQLDB/webservice/userservice"></property>
		<property name="serviceClass" value="webservice.cxf.client.UserService"></property>
		<property name="outInterceptors">
			<list>
				<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 Timestamp" />
							<!-- MD5加密明文密码 -->
							<entry key="passwordType" value="PasswordDigest" />
							<entry key="user" value="admin" />
							<entry key="passwordCallbackRef">
								<ref bean="clientPasswordCallback" />
							</entry>
						</map>
					</constructor-arg>
				</bean>
			</list>
		</property>
	</bean>
	<bean id="clientPasswordCallback" class="webservice.cxf.clientPasswordCalback.ClientPasswordCallback"></bean>

 webservice.cxf.clientPasswordCalback.ClientPasswordCallback:

package webservice.cxf.clientPasswordCalback;

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 ClientPasswordCallback implements CallbackHandler {

	@Override
	public void handle(Callback[] callbacks) throws IOException,
			UnsupportedCallbackException {
		for (Callback callback : callbacks) {
			//设置用户密码,供服务端验证
			WSPasswordCallback wsc = (WSPasswordCallback)callback;
			wsc.setIdentifier("su");
			wsc.setPassword("1234");
		}
	}

}

 Tset:

ApplicationContext app ;
	
	@Before
	public void initAPP(){
		app = new ClassPathXmlApplicationContext("cxf-client.xml");
	}
	
	@Test
	public void testSucruty(){
		UserService us = (UserService) app.getBean("userService");
		System.out.println(us.getAllUser().size());
	}
 
分享到:
评论
4 楼 chyzh2010 2013-12-06  
我现在用cxf-2.7.5进行测试,已通过明文密码验证了,但是但我测试密码验证不通过时,客户端和服务端并没有抛异常,只是在服务端的控制台打印异常出来。另外客户端的请求信息和返回信息都在客户端控制台打印了。请问验证不通过时如何告知客户端?客户端的请求信息和返回信息如何获取?谢谢....
3 楼 hash 2013-03-16  
/*
         * 此处特别注意::
         * WSPasswordCallback 的passwordType属性和password 属性都为null,
         * 你只能获得用户名(identifier),
         * 一般这里的逻辑是使用这个用户名到数据库中查询其密码,
         * 然后再设置到password 属性,WSS4J 会自动比较客户端传来的值和你设置的这个值。
         * 你可能会问为什么这里CXF 不把客户端提交的密码传入让我们在ServerPasswordCallbackHandler 中比较呢?
         * 这是因为客户端提交过来的密码在SOAP 消息中已经被加密为MD5 的字符串,
         * 如果我们要在回调方法中作比较,那么第一步要做的就是把服务端准备好的密码加密为MD5 字符串,
         * 由于MD5 算法参数不同结果也会有差别,另外,这样的工作CXF 替我们完成不是更简单吗?
         */ 


以上文字帮了我大忙...谢啦
2 楼 clean1981 2012-09-11  
请教, 节点<entry key="user" value="admin" />起的什么作用?设置默认用户名?可以不用吗? 
1 楼 dannielhome 2012-07-24  
这样,异构系统怎么接入进来调用呢?

相关推荐

    CXFWS-Security

    1)参考: ...2)CXFWS工程是基于WS-Security规范,实现X.509身份验证的,同时实现签名和加密 keytool 工具的使用参考 http://hi.baidu.com/qianshuifanchuan/blog/item/6291b8510009ad3c42a75b8e.html ...

    cxf-rt-bindings-soap-3.0.1-API文档-中文版.zip

    赠送jar包:cxf-rt-bindings-soap-3.0.1.jar; 赠送原API文档:cxf-rt-bindings-soap-3.0.1-javadoc.jar; 赠送源代码:cxf-rt-bindings-soap-3.0.1-sources.jar; 赠送Maven依赖信息文件:cxf-rt-bindings-soap-...

    CXF WS-Security WSS4J 例子

    CXF WS-Security WSS4J 例子 可以运行,运行的时候只要运行client就行,重点是运行完之后要关掉第一个控制台,才能看到结果。一定要记得改一下client的路径名

    cxf ws-Security的实现

    cxf ws-Security的实现 WS-SecurityPolicy 安全配置指定在客户机和服务之间交换的消息所需的安全处理。在大多数情况下,Web 服务堆栈还需要更多信息,才能对消息交换应用安全措施。 里面有2个project,分别server ...

    cxf-rt-ws-addr-3.0.1-API文档-中文版.zip

    赠送jar包:cxf-rt-ws-addr-3.0.1.jar; 赠送原API文档:cxf-rt-ws-addr-3.0.1-javadoc.jar; 赠送源代码:cxf-rt-ws-addr-3.0.1-sources.jar; 赠送Maven依赖信息文件:cxf-rt-ws-addr-3.0.1.pom; 包含翻译后的API...

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

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

    cxf.xml,cxf-servlet.xml,cxf-extension-soap.xml

    &lt;import resource="classpath:META-INF/cxf/cxf.xml"/&gt; &lt;import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/&gt; &lt;import resource="classpath:META-INF/cxf/cxf-servlet.xml"/&gt;

    cxf+ws-security-JAR

    cxf结合ws-security实现webservice 用户名/密码身份认证安全调用,依赖包

    cxf-rt-ws-policy-3.0.1-API文档-中文版.zip

    赠送jar包:cxf-rt-ws-policy-3.0.1.jar; 赠送原API文档:cxf-rt-ws-policy-3.0.1-javadoc.jar; 赠送源代码:cxf-rt-ws-policy-3.0.1-sources.jar; 赠送Maven依赖信息文件:cxf-rt-ws-policy-3.0.1.pom; 包含...

    Cxf 和wss4j实现ws-security的demo

    CXF使用WSS4J实现WS-Security规范,本例的配置是Timestamp Signature Encrypt,具体使用可以参考我的博客http://blog.csdn.net/wangchsh2008/article/details/6708270

    CXF(WS_Security)证书加密

    对WebServcie进行双层加密,自己写的一个小例子。

    cxf-uw-ws-soap

    cxf的webservice, 基于soap的协议,soapui测试。 三大接口,jaxb解析XML

    cxfWebservice客户端全部jar包及极简调用方法.rar

    udp-3.0.11.jar,cxf-rt-wsdl-3.0.0.jar,cxf-rt-ws-security-3.0.0.jar,neethi-3.0.3.jar,slf4j-api-1.7.7.jar,stax2-api-3.1.4.jar,woodstox-core-asl-4.4.1.jar,wsdl4j-1.6.3.jar,wss4j-bindings-2.0.9.jar,xml...

    cxf-rt-bindings-soap-2.7.6.zip

    text.zip,分隔标记/注释文本模型

    我的cxf与ws-security

    经过了几天的努力与查询不少的资料与调试,头都大了,终于给CXF加上了一把密码锁,希望进步;

    cxf-rt-transports-http-3.0.1-API文档-中文版.zip

    赠送jar包:cxf-rt-transports-http-3.0.1.jar; 赠送原API文档:cxf-rt-transports-http-3.0.1-javadoc.jar; 赠送源代码:cxf-rt-transports-http-3.0.1-sources.jar; 赠送Maven依赖信息文件:cxf-rt-transports-...

    cxf-rt-frontend-simple-3.0.1-API文档-中文版.zip

    赠送jar包:cxf-rt-frontend-simple-3.0.1.jar; 赠送原API文档:cxf-rt-frontend-simple-3.0.1-javadoc.jar; 赠送源代码:cxf-rt-frontend-simple-3.0.1-sources.jar; 赠送Maven依赖信息文件:cxf-rt-frontend-...

    Web 服务规范_第 4 部分:WS-Security源码

    了解 Web 服务规范_第 4 部分:WS-Security源码

    cxf3.1.18.rar

    spring 4.2.0 集成的cxf3.1.18的jar包,cxf-core-3.1.18.jar、cxf-rt-bindings-soap-3.1.18.jar、cxf-rt-databinding-jaxb-3.1.18.jar、cxf-rt-frontend-jaxws-3.1.18.jar、cxf-rt-frontend-simple-3.1.18.jar、cxf-...

    cxf-core-3.0.1-API文档-中文版.zip

    赠送jar包:cxf-core-3.0.1.jar; 赠送原API文档:cxf-core-3.0.1-javadoc.jar; 赠送源代码:cxf-core-3.0.1-sources.jar; 赠送Maven依赖信息文件:cxf-core-3.0.1.pom; 包含翻译后的API文档:cxf-core-3.0.1-...

Global site tag (gtag.js) - Google Analytics