首页 > 其他分享 >WebService开发笔记 3 -- 增强访问 WebService 的安全性

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

时间:2023-08-28 14:04:27浏览次数:43  
标签:WebService -- 笔记 public pc org import security WSPasswordCallback


在 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);		
	}
}

标签:WebService,--,笔记,public,pc,org,import,security,WSPasswordCallback
From: https://blog.51cto.com/u_16237557/7263416

相关文章

  • 你不知道的 JavaScript - “this”
    JavaScript里的this到底指得是什么?很多人都会告诉你this指的是当前对象。这样理解对么?在大多数情况下确实没错。比如我们经常会在网页上写这样的JavaScript: <inputtype="submit"value="提交"onclick="this.value='正在提交数据'"/......
  • WebService开发笔记 2 -- VS 2005 访问WebServcie更简单
    在上一回中我们创建了一个WebService服务(WebService开发笔记1--利用cxf开发WebService竟然如此简单),下面就来作一个跨平台访问WebServcie服务的例子....下面将在vs2005中通过c#.net访问我们创建好的WebService服务,C#.net第一次用,TNN的没想到这么简单,MS就是MS,不服不行。1.......
  • JavaScript FSO属性大全
     什么是FSO?FSO即FileSystemObject文件系统对象,是一种列表Windows磁盘目录和文件,对目录和文件进行删除、新建、复制、剪切、移动等操作的技术。使用FSO网站的好处:直接读取目录下的文件和子目录,方便维护,如需要添加任何内容,将文件放在相应的目录下即可;FSO网站类似Window......
  • 让你的网站IE8浏览自动用IE7兼容模式
    文件兼容性用于定义让IE如何编译你的网页。此文件解释文件兼容性,如何指定你网站的文件兼容性模式以及如何判断一个网页该使用的文件模式。前言为了帮助确保你的网页在所有未来的IE版本都有一致的外观,IE8引入了文件兼容性。在IE6中引入一个增设的兼容性模式,文件兼容性使你能够在IE呈......
  • SVN服务器架设
    如何快速建立Subversion服务器,并且在项目中使用起来,这是大家最关心的问题,与CVS相比,Subversion有更多的选择,也更加的容易,几个命令就可以建立一套服务器环境,可以使用起来,这里配套有动画教程。本文是使用Subversion最快速的教程,在最短的时间里帮助您建立起一套......
  • [urlrewrite]使用urlrewrite进行地址自动重定向
    一般通过url访问网站,url的格式都是http://xxx.xxx.com?param=p1&param=p2 这是最传统的访问方式,但是,对于一些具有特殊要求的系统,其所有的页面的地址并不一定是这样子的格式,或者是类似于struts风格的.do的方式,比如http://xxx.xxx.com/aa.do其中的aa并不是action映射名称,而是其中一......
  • JasperReports+iReport在eclipse中的使用
    一、介绍1)它可以PDF,HTML,XML等多种形式产生报表或动态报表,在新版本还支持CSV,XLS,RTF等格式的报表;2)它按预定义的XML文档来组织数据,来源多(如:关系数据库,Java容器对象(collection,arrays)等);报表的填充过程:先产生报表设计对象->序列化该对象->存储在磁盘或网络-......
  • 介绍一下Oracle的操作符优化
    IN:IN写出来的SQL比较容易写及清晰易懂但是性能总是比较低的,从ORACLE执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别:ORACLE试图将IN转换成多个表的连接,如果转换不成功会先执行IN里面的子查询,再查询外层的表记录,如果转换成功,则直接采用多个表的连接方式查询。所以用IN的SQL至......
  • 让用户访问Tomcat时强制跳转到Https方式
    让用户访问Tomcat时强制跳转到Https方式。首先配置Tomcat可以在Https下运行,相应的配置,请查看其它说明文档。http://www.iteye.com/topic/78274修改tomcat/conf/web.xml文件,在</welcome-file-list>下面加上如下语句<login-config><!--Authorizatio......
  • JSP获得服务端与客户端信息
    System.out.println("Protocol:"+request.getProtocol());System.out.println("Scheme:"+request.getScheme());System.out.println("ServerName:"+request.getServerName());System.out.println("ServerPort:"+re......