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

WebService开发笔记 3 -- 增强访问 WebService 的安全性

    博客分类:
  • JAVA
阅读更多
WebService开发笔记 1中我们创建了一个WebService简单实例,下面我们通过一个简单的用户口令验证机制来加强一下WebService的安全性:

1.修改WebService 服务端 spring 配置文件 ws-context.xml
<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://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd"
	default-autowire="byName" default-lazy-init="true">
	
	<jaxws:endpoint id="webServiceSample"
		address="/WebServiceSample" implementor="cn.org.coral.biz.examples.webservice.WebServiceSampleImpl">

		<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="passwordCallbackClass" value="cn.org.coral.biz.examples.webservice.handler.WsAuthHandler" />
					</map>
				</constructor-arg>
			</bean>
		</jaxws:inInterceptors>	

	</jaxws:endpoint>
	
</beans>


2.服务端添加passwordCallbackClass回调类,该类进行用户口令验证:
package cn.org.coral.biz.examples.webservice.handler;

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

	public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException {
		WSPasswordCallback pc = (WSPasswordCallback) callbacks[0];
        if (pc.getIdentifer().equals("ws-client")){
            if (!pc.getPassword().equals("admin")) {
                throw new SecurityException("wrong password");
           }
        }else{
        	throw new SecurityException("wrong username");
        }
	}

}


3.客户端修改spring 配置文件 wsclient-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://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans.xsd"
	default-autowire="byName" default-lazy-init="true">


	<!-- ws clinet -->
	<bean id="webServiceSampleClient" class="cn.org.coral.biz.examples.webservice.WebServiceSample"
		factory-bean="webServiceSampleClientFactory" factory-method="create" />


	<bean id="webServiceSampleClientFactory"
		class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
		<property name="serviceClass"
			value="cn.org.coral.biz.examples.webservice.WebServiceSample" />
		<property name="address"
			value="http://88.148.29.54:8080/aio/services/WebServiceSample" />
		<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="ws-client" />
				<entry key="passwordType" value="PasswordText" />
				<entry>
					<key>
						<value>passwordCallbackRef</value>
					</key>
					<ref bean="passwordCallback" />
				</entry>
			</map>
		</property>
	</bean>
	<bean id="passwordCallback"
		class="cn.org.coral.biz.examples.webservice.handler.WsClinetAuthHandler">
	</bean>

</beans>


4.客户端添加passwordCallback类,通过该类设置访问口令
package cn.org.coral.biz.examples.webservice.handler;

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[0]; 
                    int usage = pc.getUsage(); 


                    System.out.println("identifier: " + pc.getIdentifer()); 
                    System.out.println("usage: " + pc.getUsage()); 
                    if (usage == WSPasswordCallback.USERNAME_TOKEN) { 
                            // username token pwd... 
                            pc.setPassword("admin"); 

                    } else if (usage == WSPasswordCallback.SIGNATURE) { 
                            // set the password for client's keystore.keyPassword 
                            pc.setPassword("keyPassword"); 
                    } 
            } 
    } 

}


5.junit单元测试程序:
package cn.org.coral.biz.examples.webservice;

import org.springframework.test.AbstractDependencyInjectionSpringContextTests;
import org.springframework.util.Assert;

public class TestWebService extends AbstractDependencyInjectionSpringContextTests {
	WebServiceSample webServiceSampleClient;
	
	@Override
	protected String[] getConfigLocations() {
		setAutowireMode(AUTOWIRE_BY_NAME);
		return new String[] { "classpath:/cn/org/coral/biz/examples/webservice/wsclient-context.xml" };
	}

	/**
	 * @param webServiceSampleClient the webServiceSampleClient to set
	 */
	public void setWebServiceSampleClient(WebServiceSample webServiceSampleClient) {
		this.webServiceSampleClient = webServiceSampleClient;
	}

	public void testSay(){
		String result = webServiceSampleClient.say(" world");
		Assert.hasText(result);		
	}
}
19
5
分享到:
评论
8 楼 chxiaowu 2011-11-25  
从头到尾没发现 那里有 cxf bean配置啊。。。。
7 楼 chxiaowu 2011-11-25  
严重: StandardWrapper.Throwable
org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'cxf' is defined
at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:387)
at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:971)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:246)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:185)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:168)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:884)
at org.apache.cxf.transport.servlet.CXFServlet.loadBus(CXFServlet.java:60)
at org.apache.cxf.transport.servlet.CXFNonSpringServlet.init(CXFNonSpringServlet.java:56)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1228)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1147)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:836)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1824)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
2011-11-25 16:09:45 org.apache.catalina.core.StandardWrapperValve invoke
6 楼 chxiaowu 2011-11-25  
No bean named 'cxf' is defined


??????????
5 楼 冰火人 2011-08-31  
请问楼主这个是你自己的还是转的别人的,你自己测试了没有!

服务端 passwordCallbackClass中:pc.getPassword()这里有值???
…………
4 楼 zhengguang_xia 2009-01-16  
如果能加点注释,解释下就好了
3 楼 zhunzhunzhun-sky 2008-09-02  
是啊,我想知道你是怎么学的~~~
2 楼 sskhnje 2008-08-20  
你好, 我的是cxf2.1.1 出现了以下异常, 谢谢啊!

org.apache.cxf.binding.soap.SoapFault: Problems creating SAAJ object model
at org.apache.cxf.binding.soap.saaj.SAAJInInterceptor.handleMessage(SAAJInInterceptor.java:117)
at org.apache.cxf.binding.soap.saaj.SAAJInInterceptor.handleMessage(SAAJInInterceptor.java:63)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:221)
at org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:449)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1996)
at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1832)
at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:66)
at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:591)
at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:221)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:296)
at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:242)
at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:73)
at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:178)
at $Proxy43.sayHi(Unknown Source)
at a.Client.main(Client.java:38)
Caused by: javax.xml.soap.SOAPException: Failed to create MessageFactory: org.apache.axis.soap.MessageFactoryImpl
at javax.xml.soap.MessageFactory.newInstance(MessageFactory.java:55)
at org.apache.cxf.binding.soap.saaj.SAAJInInterceptor.handleMessage(SAAJInInterceptor.java:77)
... 15 more
1 楼 sskhnje 2008-08-19  
你好, 我也看了CXF的文档, 怎么我除了配helloworld外什么都没学到, 请问你是怎么学的?
期望你的指教, 谢谢啊!

相关推荐

    WebService 开发大全

    例如,在《WebService开发笔记 3 -- 增强访问WebService的安全性》中,提到通过简单的用户口令验证机制来加强安全性。这通常涉及到WS-Security规范,可以设置消息头中的用户名令牌或数字证书,确保只有经过授权的...

    WebService接口调试工具- SoapUI-5.2.1-windows-bin.zip

    【WebService接口调试工具-...通过熟练掌握SoapUI,开发者能够有效地调试和测试WebService接口,确保服务的质量和可靠性。无论是在开发阶段的接口验证,还是在运维阶段的问题排查,SoapUI都是一个不可或缺的工具。

    WebService学习笔记

    **WebService学习笔记** WebService是一种基于互联网的、平台和语言无关的接口规范,它允许不同系统间的应用程序进行交互和数据共享。这项技术的核心是利用XML(可扩展标记语言)作为数据交换格式,SOAP(简单对象...

    WebService源码和笔记.zip

    4. **WebService开发工具**:如使用Apache CXF、Gson、JAXB等工具进行WebService的开发和调试。 5. **安全性考虑**:介绍如何在WebService中实现安全机制,如HTTPS加密、WS-Security(SOAP消息的安全标准)等。 6....

    WebService学习笔记0001

    【WebService学习笔记0001】 在IT领域,WebService是一种基于开放标准(如XML、SOAP、WSDL和UDDI)的互...在后续的学习中,你还会接触到WS-Security、WS-Policy等高级主题,进一步增强WebService的安全性和可扩展性。

    CXF webservice初学笔记

    【CXF Webservice初学笔记】 Apache CXF 是一个开源的 Web 服务框架,它允许开发者创建和消费各种类型的 Web 服务。CXF 整合了 XFire 和 Celtix 两个项目,提供了一套全面的工具和服务接口,支持 SOAP、RESTful、WS...

    Java+WebService利用(cxf)开发笔记.rar

    这篇"Java+WebService利用(cxf)开发笔记"是一个宝贵的资源,尤其适合初学者理解和掌握CXF框架。 1. **Java WebService概述**:Java WebService是基于标准的、平台无关的方式来实现服务导向架构(SOA)。它通过WSDL...

    WebService

    【WebService技术详解】 WebService是一种基于互联网的、平台和语言无关的接口标准,它允许不同...学习过程中,参考"Java WebService利用(cxf)开发笔记"和"WebService开发笔记"等文档将有助于深化理解和提高实践能力。

    122158-Webservice学习笔记.doc

    SOAP消息通过HTTP或HTTPS协议传输,确保了数据的安全性和可靠性。 Web服务的工作流程如下: 1. **客户端**:客户端应用程序通过生成一个SOAP消息,封装了调用Web服务的方法及参数,然后使用HTTP协议发送到Web服务...

    WebService 学习

    【WebService学习】 ...深入理解和掌握WebService相关知识,对于提升软件开发的灵活性和可扩展性具有重要意义。通过不断实践和学习,你将能够熟练地运用WebService技术解决实际问题,实现系统的互联互通。

    Webservice学习笔记.doc

    Web Service是一种基于开放标准的技术,允许不同的应用程序之间通过互联网交换数据,实现跨平台、跨语言的互操作性。它的核心理念是创建无需用户界面就能与其他应用交互的Web应用程序。例如,在金融行业中,一个股票...

    webservice cxf 开发实战

    本篇将深入探讨CXF框架在Webservice开发中的实战应用。 【源码】标签提示我们,我们将深入到代码层面,理解CXF的工作原理以及如何使用它来创建和消费Web服务。源码分析对于提升开发者的技术深度至关重要,因为这...

    燕青webservice笔记

    【燕青WebService笔记】 在IT行业中,Web Service是一种基于开放标准的、用于应用程序之间的通信技术。它允许不同的系统之间交换数据和服务,无论这些系统是由何种编程语言或平台构建的。燕青WebService笔记主要...

    webservice源码和笔记.rar

    本压缩包“webservice源码和笔记.rar”包含了关于Web服务的源代码和相关学习笔记,旨在帮助用户深入理解Web服务的工作原理及其在实际开发中的应用。 1. Web服务定义: Web服务是通过HTTP协议来传输数据的,这种服务...

    webservice入门学习代码笔记

    7. **安全性**:Web服务的安全性非常重要,包括身份验证、授权、数据加密等方面。常见的安全机制有HTTPS、WS-Security、OAuth等。 8. **版本管理**:随着服务的迭代更新,版本管理变得必要,如使用WSDL版本号或服务...

    webservice学习笔记

    - **WS-Security**:提供Web服务的安全性,如身份验证、消息完整性与机密性。 - **JAX-WS和JAX-RS**:JAX-WS是Java中处理SOAP Web服务的标准API,JAX-RS则是处理RESTful服务的标准API。 - **UDDI的作用**:UDDI目录...

Global site tag (gtag.js) - Google Analytics