`
wangwengcn
  • 浏览: 176224 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

2.CXF安全访问之Http Basic Auth(一)

    博客分类:
  • CXF
阅读更多

CXF涉及安全方面主要有三个途径:

  1. 最简单的方式是使用Http Basic Auth,就是WSS4J的UsernameToken实现方式,优点是简单易用,缺点是每次都会在MESSAGE里面传密码,安全性低。
  2. Transport level(传输层内)的实现Https。CXF samples里面有一个例子wsdl_first_https, 很详细的讲了怎么使用。
  3. 对MESSAGE进行加密和签名(encryption and signing),请参考官方教程

先来看第一种实现方式,按照上一篇教程中的内容先配置好,然后根据下面顺序进行修改

1.  修改服务端spring配置文件

 

<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-servlet.xml" />

	<bean id="serverPasswordCallback" class="com.demo.cxf.callbacks.ServerPasswordCallback"></bean>
	<bean id="serverWSS4JInInterceptor" 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="passwordCallbackRef">
					<ref bean="serverPasswordCallback" />
				</entry>
			</map>
		</constructor-arg>
	</bean>

	<jaxws:endpoint id="helloWorld"
		implementor="com.demo.cxf.helloword.impl.HelloWordImpl" address="/HelloWorld">
		<jaxws:inInterceptors>
			<bean class="org.apache.cxf.interceptor.LoggingInInterceptor" />
			<ref bean="serverWSS4JInInterceptor"/>
		</jaxws:inInterceptors>
		<jaxws:outInterceptors>
			<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
		</jaxws:outInterceptors>
		<jaxws:properties>
			<entry key="mtom-enabled" value="true" />
		</jaxws:properties>
	</jaxws:endpoint>

</beans>

 

2.  创建服务端CallbackHandler

 

package com.demo.cxf.callbacks;

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.ws.security.WSPasswordCallback;

public class ServerPasswordCallback implements CallbackHandler {
	
	Map<String, String> user = new HashMap<String, String>();
	{
		user.put("admin", "123");
		user.put("su", "123");
	}
	
	@Override
	public void handle(Callback[] callbacks) throws IOException,UnsupportedCallbackException 
	{
		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();
		System.out.println("userName:" + username + " password:" + password);
	}

}

 

3.  修改客户端spring配置文件

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:jaxws="http://cxf.apache.org/jaxws" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	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">

	<bean id="clientOutPasswordCallback" class="cxf.callbacks.ClientOutPasswordCallback"></bean>
	<bean id="clientWSS4JOutInterceptor" 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="clientOutPasswordCallback" />
				</entry>
			</map>
		</constructor-arg>
	</bean>

	<jaxws:client id="helloClient" serviceClass="com.demo.cxf.helloword.HelloWord"
		address="http://localhost:8080/webservice/services/HelloWorld">
		<jaxws:outInterceptors>
			<ref bean="clientWSS4JOutInterceptor"/>
		</jaxws:outInterceptors>
	</jaxws:client>
</beans>

 

 

4.  创建客户端CallbackHandler

 

package cxf.callbacks;

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

	@Override
	public void handle(Callback[] callbacks) throws IOException,
			UnsupportedCallbackException {
		if (callbacks != null && callbacks.length > 0) {
			Callback callback = callbacks[0];
			
			// 设置用户密码,供服务端验证,可以从配置文件或者数据库里面读取
			WSPasswordCallback wsc = (WSPasswordCallback) callback;
			wsc.setPassword("123");
		}
	}

}

 

 

5.  调用代码

ApplicationContext context = new ClassPathXmlApplicationContext(
				"cxf/cxf-client.xml");
HelloWord helloWord = (HelloWord) context.getBean("helloClient");
System.out.println(helloWord.sayHello("Bruce"));

 

分享到:
评论

相关推荐

    3.CXF安全访问之SIGN_ENC(二)

    【标题】:“3.CXF安全访问之SIGN_ENC(二)” 在本文中,我们将深入探讨Apache CXF框架中实现的安全访问机制,特别是SIG_N_ENC,这是一个结合了签名(Signature)和加密(Encryption)的安全策略。CXF是一个开源的...

    4.CXF安全访问之单向SSL或者双向SSL(三)

    本篇将详细探讨如何使用CXF实现单向SSL(Secure Sockets Layer)和双向SSL的安全访问。首先,我们需要理解SSL的基本概念。 SSL是一种网络安全协议,用于在客户端和服务器之间建立加密连接,确保数据传输的隐私和...

    org.apache.cxf.spring.remoting.Jsr181HandlerMapping.jar

    org.apache.cxf.spring.remoting.Jsr181HandlerMapping.jar

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

    2. **创建安全上下文**:为了实现身份验证,你需要创建一个`WSS4JOutInterceptor`,并提供安全相关的配置,比如使用`UsernameToken`进行基本认证。这可以通过`WSSecurityProperties`类来完成。 3. **添加拦截器**:...

    TipTec.Developing.Web.Services.with.Apache.CXF.and.Axis2.Jan.2010.rar

    标题中的“TipTec.Developing.Web.Services.with.Apache.CXF.and.Axis2.Jan.2010”表明这是一份关于使用Apache CXF和Axis2开发Web服务的教程资料,发布于2010年1月。Apache CXF和Axis2是两个流行的Java框架,用于...

    apache-cxf-2.4.6.zip

    Apache CXF是一个开源的Java框架,它主要用于构建和开发服务导向架构(SOA)和Web服务。这个"apache-cxf-2.4.6.zip"压缩包包含了CXF框架的2.4.6版本,这是一个相对早期的版本,发布于2012年。在深入探讨CXF之前,...

    cxf框架包 apache-cxf-3.4.3.tar.gz

    Apache CXF是一个开源的Java框架,它主要用于构建和开发Web服务。这个框架允许开发者通过SOAP、RESTful HTTP、XML以及各种协议来实现服务接口。在本案例中,我们讨论的是"apache-cxf-3.4.3.tar.gz",这是Apache CXF ...

    cxf的jar包.rar

    利用Apache CXF开发webservice接口需要用到的jar集合 cxf-core-3.0.15.jar cxf-rt-bindings-soap-3.0.15.jar cxf-rt-bindings-xml-3.0.15.jar cxf-rt-databinding-jaxb-3.0.15.jar cxf-rt-frontend-jaxws-3.0.15.jar...

    CXF之二(上传及下载附件)

    CXF提供了`org.apache.cxf.jaxrs.ext.multipart.MultipartProvider`类,它可以解析Multipart请求并将文件内容转化为可操作的对象。 3. **处理文件上传**: 在服务端的实现类中,我们可以读取`InputStream`或`Part`...

    02.CXF功能概述_CXF发展历史和使用CXF开发WebService服务器端

    自其诞生以来,CXF已经成为Java社区中广泛使用的Web服务框架之一,尤其在SOAP和RESTful服务的实现上表现出色。 CXF的主要功能包括: 1. **SOAP支持**:CXF能够处理SOAP 1.1和1.2规范,支持WSDL(Web服务描述语言)...

    PacktPub.Apache.CXF.Web.Service.Development.Dec.2009.rar

    这个压缩包文件"PacktPub.Apache.CXF.Web.Service.Development.Dec.2009.rar"包含了关于使用Apache CXF进行Web服务开发的详细教程,可能出自Packt Publishing在2009年12月出版的一本书。该资源很可能提供了深入的...

    apache-cxf3.1.15和3.2.3合集及jdk说明

    Apache CXF 3.1.15是该框架的一个稳定版本,它可能包含了若干bug修复和安全更新。而3.2.3则可能引入了新功能、性能优化以及对新标准的支持。这两个版本之间的差异可能包括API的变化、改进的错误处理和新的模块添加。...

    CXF打印SOAP报文,记录WebService日志

    import org.apache.cxf.phase.AbstractPhaseInterceptor; import org.apache.cxf.phase.Phase; public class InInterceptor extends AbstractPhaseInterceptor&lt;Message&gt; { private int limit = 102400; public ...

    apache-cxf-2.7.5所有jar都在

    在实际使用中,开发者可能还需要配置CXF的相关XML配置文件(如cxf.xml或cxf-servlet.xml),以定制服务行为和设置。此外,通过Maven或Gradle等构建工具,可以更方便地管理和引入CXF的依赖。 总之,Apache CXF 2.7.5...

    cxf开发指南

    1. CXF 官方网址:http://cxf.apache.org/ 2. Jar 包下载地址:http://www.apache.org/dyn/closer.cgi?path=/cxf/2.3.3/apache-cxf-2.3.3.zip 3. 源码下载:...

    apache cxf_jar包

    Apache CXF是一个开源的Java框架,它主要用于构建和开发服务导向架构(SOA)中的Web服务。这个"apache cxf_jar包"包含了实现基于Java的Web服务所需的一系列核心库。下面我们将深入探讨这些jar文件及其在Web服务实现...

Global site tag (gtag.js) - Google Analytics