`
redhacker
  • 浏览: 494484 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一种简单的web service服务安全策略

 
阅读更多
继上两篇(jdk6下开发webservice示例,利用soapui和jdk API访问webservice)关于如何创建并调用web service的博客后,我一直还想写点关于web service相关的内容,一直忙其他的事,拖到今天,终于要想写一点。

对于web service,通过前面两篇博客,我们已经能够很方便的创建一个web service,并调用它,对于初学web service技术的同学来说,是个良好的开端。但是,很快大家会提出一个问题:这样的web service如何保证它的安全性呢?今天我就向大家介绍一种比较简单的方式。

1、这种ws安全的原理示意图

为了让大家清楚的了解篇文章想要讲述的WS安全原理,我粗略的画了一个图。后面叙述我会结合该图进行讲述。



2、让我们先看看Tomcat2中App1的WS要如何通过容器认证保护起来

在web.xml里,我们加入如下代码,对ws进行保护:

  <security-role>
    <description>role for acess the WS api</description>
    <role-name>WSAdmin</role-name>
  </security-role>
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>web service api</web-resource-name>
      <url-pattern>/ws/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>WSAdmin</role-name>
    </auth-constraint>
    <user-data-constraint>
      <transport-guarantee>NONE</transport-guarantee>
    </user-data-constraint>
  </security-constraint>
  <login-config>
    <auth-method>BASIC</auth-method>
  </login-config>


在tomcat/conf/tomcat-user.xml,定义保护起来的WS对应的角色和用户,如下所示

<tomcat-users>
	<role rolename="WSAdmin"/>
	<user username="redhacker" password="11111111" roles="WSAdmin"/>
</tomcat-users>


从上面代码可以看到只要URL为/ws/*的WS服务均需要进过容器认证,认证的约束是:必须是WSAdmin下的用户,这些代码片段相信大家很容易理解。

那么我们的WS是如何编写的?如果这个还不会的话,请大家补习“jdk6下开发webservice示例

3、通过上面的的机制,WS服务被容器认证保护了起来!这是大家通过浏览器访问这个WS服务,浏览器将会提示您输入用户名和密码,如下图所示:



输入正确的用户名和密码(这个用户名和密码是我们在上一个步骤中配置好的,并且是属于WSAdmin这个角色的),你将会访问到这个WS,如下图所示:



这时候,我们就可以认为我么的WS服务被有效的保护起来了!

4、再来让我们先看看APP1中的ws client的代码:
public class HelloServiceTest {

	// 调用WS
	public static String testHelloService(String name) throws Exception,
			IOException {
	    
       Authenticator.setDefault(new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("redhacker", "11111111".toCharArray());
            }
        });

		// 构建请求报文
		StringBuffer sendMsgBuffer = new StringBuffer(
				"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:jav=\"http://www.javaedu.com\">");
		sendMsgBuffer.append("<soapenv:Header/>").append("<soapenv:Body>")
				.append("<jav:hello>").append("<arg0>").append(name)
				.append("</arg0>").append("</jav:hello>")
				.append("</soapenv:Body>").append("</soapenv:Envelope>");
		String sendMsg = sendMsgBuffer.toString();

		// 开启HTTP连接ַ
		URL url = new URL(Util.HELLO_WS_URL);
		HttpURLConnection httpConn = (HttpURLConnection) url.openConnection();
		
		// 设置HTTP请求相关信息
		httpConn.setRequestProperty("Content-Length",
				String.valueOf(sendMsg.getBytes().length));
		httpConn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
		httpConn.setRequestMethod("POST");
		httpConn.setDoOutput(true);
		httpConn.setDoInput(true);

		// 进行HTTP请求
		OutputStream outObject = httpConn.getOutputStream();
		outObject.write(sendMsg.getBytes());
		
		// 关闭输出流
		outObject.close();

		// 获取HTTP响应数据
		InputStreamReader isr = new InputStreamReader(
				httpConn.getInputStream(), "utf-8");
		BufferedReader inReader = new BufferedReader(isr);
		StringBuffer result = new StringBuffer();
		String inputLine;
		while ((inputLine = inReader.readLine()) != null) {
			result.append(inputLine);
		}
		
		// 打印HTTP响应数据
		System.out.println(result);
		
		// 关闭输入流
		inReader.close();
		isr.close();
		return result.toString();
	}


上面的代码与前面博客中提到WS调用方式没什么两样,唯一不同的是,这段代码中加入了如下认证代码:

       Authenticator.setDefault(new Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("redhacker", "11111111".toCharArray());
            }
        });


上面这段代码就是通过程序访问WS前需要进行的认证,我们看看上面客户端程序执行的效果!通过执行客户端,得到如下报文信息:

<?xml version="1.0" ?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><ns2:helloResponse xmlns:ns2="http://www.javaedu.com"><return>Hello,jack</return></ns2:helloResponse></S:Body></S:Envelope>


当我们从ws client中删除上述认证代码,执行将产生如下错误:
Exception in thread "main" java.io.IOException: Server returned HTTP response code: 401 for URL: http://127.0.0.1:8080/ws/HelloServicePort?wsdl
	at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1436)
	at com.je.ws.client.HelloServiceTest.testHelloService(HelloServiceTest.java:56)
	at com.je.ws.client.HelloServiceTest.main(HelloServiceTest.java:75)


总结:

通过上除的一种机制,我们就可以有效的保护我们的WS服务了!当然,关于WS安全不仅仅是上述一种方法,我将在后续的博客中介绍其他的方式。值得需要说明的是,上述机制在weblogic上,会有一些问题,大家可以看一下这个(https://forums.oracle.com/message/10746741?#10744741)帖子,或许是weblogic上的一个bug,我们期待weblgic能够解决这个问题。


提示:

由于APP2较大,压缩了两个分包,大家解压的使用使用解压工具7-zip,将附件中的两个文件名改为ws_test_sample.zip.001,ws_test_sample.zip.002方可解压成功!
  • 大小: 11.2 KB
  • 大小: 61.3 KB
  • 大小: 60.6 KB
分享到:
评论

相关推荐

    Web Service的安全机制

    尽管SSL(Secure Sockets Layer,安全套接层)是一种广泛应用于Web通信中的安全协议,但在实现Web Service安全方面存在一定的局限性: - **P2P而非端到端**:SSL提供了客户端与服务器之间的点对点安全连接,这并不...

    web service 简单示例

    本教程将介绍一种“代码优先”的Web服务开发策略,即首先关注应用程序的业务逻辑,然后设计服务接口。首先,我们将创建包含核心业务用例的Java Bean(Plain Old Java Objects,POJOs)。待POJO实现完成后,再设计并...

    yahoo web service-2.11.zip

    在深入探讨之前,我们需要了解API(应用程序编程接口)的基本概念,它是软件之间交互的一种方式,让开发者可以构建应用,利用其他服务的功能或数据。 Yahoo Web Service 提供了多种功能,包括但不限于: 1. **搜索...

    web service安全机制探讨

    这有助于消费者找到符合安全策略的服务。例如,SAML(Security Assertion Markup Language)和XACML(eXtensible Access Control Markup Language)分别用于授权和访问控制的表述,使得不同系统间能一致地处理权限...

    Web service 一些整理

    Web服务是一种基于网络的、平台独立的交互方式,它允许不同的应用程序之间进行数据交换和功能调用。在本文中,我们将深入探讨Web服务的核心概念、技术栈以及Apache Axis2的相关知识,这些都是构建高效、可扩展的Web...

    web service C# 源代码

    Web服务是一种基于网络的软件应用程序,它允许不同的系统之间交换数据和执行操作。在本案例中,"web service C# 源代码"指的是使用C#编程语言开发的Web服务的源代码。C#是微软.NET框架的主要编程语言,特别适合用于...

    WCFService可以通过web调用和WCF服务访问

    Windows Communication Foundation(WCF)是微软.NET框架的一部分,它提供了一种统一的编程模型来创建分布式应用程序服务。WCF服务可以被多种客户端访问,包括基于Web的和传统的WCF客户端。在标题和描述中提到的...

    atl web service论文

    ATL Web Service是一种微软开发的技术,用于快速构建COM(Component Object Model)服务器,尤其是Web服务。ATL(Active Template Library)是C++的一个库,它提供了轻量级、高效的COM对象实现方式。在Web服务领域,...

    使用Web Service软件工厂

    在信息技术领域,Web Service是一种基于标准的、平台无关的通信机制,它允许不同的应用程序之间进行数据交换。Web Service软件工厂,也称为WebService Factory,是一个工具集或框架,旨在简化开发、部署和管理Web...

    Delphi WEB SERVICE9

    综上所述,“Delphi WEB SERVICE9”涵盖了Delphi环境下创建、测试和部署Web服务的各个方面,包括基础概念、核心技术、安全策略以及性能优化等。通过深入学习这一主题,开发者可以利用Delphi的强大功能构建高效、可靠...

    web service 相关ppt

    Web服务是一种基于互联网的软件应用程序接口(API)交互方式,它允许不同的系统和服务之间进行数据交换和业务逻辑共享。在本“Web Service相关PPT”中,我们将深入探讨这一技术的核心概念、工作原理以及相关应用。 ...

    web service学习笔记1

    1. WSDL(Web Services Description Language):这是一种XML格式,用于定义Web Service的接口,包括服务地址、消息格式、操作以及非功能性特性,如安全性、事务处理等。 2. UDDI(Universal Description, Discovery...

    ASP.NET Web Service

    总的来说,ASP.NET Web Service提供了一种强大而灵活的方式,用于构建和消费网络服务,同时支持安全的访问控制策略。这使得开发人员能够构建分布式系统,将功能和数据暴露给远程应用程序,而不用担心底层技术的差异...

    oracle adf web service 案例

    ADF Web Service则是Oracle ADF的一部分,它允许开发者创建、消费和集成Web服务,使得数据交换和业务流程自动化变得更加简单。在这个案例中,我们将深入探讨Oracle ADF Web Service的使用,包括其核心概念、工作原理...

    天气预报web service

    在IT行业中,Web Service是一种基于网络的、分布式的模块化组件,它允许不同系统之间通过标准接口进行通信。本项目“天气预报Web服务”提供了一个具体的实例,展示了如何利用Web Service技术获取实时天气信息,并且...

Global site tag (gtag.js) - Google Analytics