您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > Webservices之安全实践
Webservices安全实践--基于HTTPBasicAuthentication为Webservices配置传输层安全机制根据RFC2617的规定,HTTP有两种标准的认证方式,即,BASIC和DIGEST。HTTPBasicAuthentication是指客户端必须使用用户名和密码在一个指定的域(Realm)中获取认证。本文将介绍HTTPBasicAuthentication在不同的应用服务器上的实现方法,并着重介绍不同Webservices的实现是如何使用HTTPBasicAuthentication来增强安全性的。通过主流Webservices服务实现来测试HTTPBasicAuthentication:通过ApacheTomcat+Axis来讲述如何在ApacheTomcat上配置HTTPBasicAuthentication,并使用ApacheAxis实现的Webservices加以测试;通过IBMWebSphereApplicationServer(以下简称WAS)+JavaAPIforXMLWebservices(以下简称JAX-WS)来讲述如何在WAS上配置HTTPBasicAuthentication,并使用JAX-WS实现的Webservices加以测试。在文章的后半段,本文会讲述如何使用SOAPUI测试Webservices的HTTPBasicAuthentication,内容涵盖:从WSDL文件创建测试用例,增加验证点以及执行测试。简介正如HTTPBasicAuthentication这个名字,它是Authentication(认证)中最简单的方法。长期以来,这种认证方法被广泛的使用。当你通过HTTP协议去访问一个使用BasicAuthentication保护的资源时,服务器通常会在HTTP请求的Response中加入一个401需要身份验证的Header,来通知客户提供用户凭证,以使用资源。如果你正在使用InternetExplorer或者MozillaFirefox这样的可视化浏览器来访问需要认证的资源,浏览器会弹出一个窗口,让你输入用户名和密码,如果所输入的用户名在资源使用者的验证列表,并且密码完全正确,此时,用户才可以访问受限的资源。那么什么是HTTPBasicAuthentication呢?如何在不同的服务器上配置BasicAuthentication呢?下面本文将展开介绍。HTTPBasicAuthentication介绍HTTPBASIC认证的基本流程如图1所示,图1.BASICHTTP认证基本流程HTTPBasicAuthentication是指客户端在使用HTTP协议访问受限资源时,必须使用用户名和密码在一个指定的域(Realm)中获取认证。在正式开始之前,我们需要明白以下名词的含义:1.Authentication,即认证,验证。它是一种确认的过程,通过这样的认证过程,你可以确定某物体是不是它所声称的那种物体。这通常会涉及到用户名和密码,也可能是身份证明,或生物特征,如视网膜等。2.Realm,即域。一个Realm就是一系列用户名和密码的“数据库”,它通常用来保存、识别某个或某些Web应用中有效的用户和密码。它还定义了每个有效用户所对应的角色。本文将介绍如何使用HTTPBASICAuthentication来保护Webservicesendpoint服务资源,当Webservices的Endpoints被设置为BASICHTTP认证才能访问的受限资源时,用户必须提供用户名密码才能使用它们,基本的流程如图2所示。图2.Webservices客户端访问受限Webservices服务流程下面,本文将以Tomcat何WebSphereApplicationServer为例,分别讲述如何配置Webservices的endpoint为受限资源,并使用Webservices静态和动态客户端分别加以测试。为Tomcat配置BasicAuthentication本节将详细讲述如何在Tomcat下使用BasicAuthentication来增强Axis实现的Webservices访问的安全性。本文使用Eclipse来开发相关的例子,在这里假设您已经安装了相关的环境。创建WebservicesProvider应用在Eclipse中新建一个DynamicWebProject,并将其命名为“TomcatAxis”如图3所示:图3.创建动态WEB工程该工程的目录结构如图4所示:图4.工程结构为Webservices添加实现创建一个基于Axis实现的WebService,本文采取“BottomupJavabeanWebService”方式创建,其具体操作过程为:1.创建该Webservices的实现类,代码如下清单1.WebservicesProvider实现代码packagesample.test;publicclassServiceImpl{/***returnthesummationofthetwointegerarguments*@paramaddend*@paramaugend*@return*/publicintsum(intaddend,intaugend){returnaddend+augend;}}2.基于该实现类,创建WebService,如图5所示图5.创建WebService完成上述步骤后,会在/TomcatAxis/WebContent/wsdl/目录下创建一个名称为“ServiceImpl.wsdl”的WSDL文件。3.将WebApplication部署到Tomcat上,使用Eclipse自带的Webservices测试工具“WebservicesExplorer”来测试所创建的Webservices是否能被使用,如图6所示图6.测试所创建的Webservices在确认所创建的Webservices能够正常使用后,需要为WebApplication配置BasicAuthentication。为WebApplication配置BasicAuthentication:1.打开Tomcat安装目录下的“conf”文件夹,修改文件“tomcat-users.xml”,该文件是用来存储Tomcat预加载的用户和角色定义的,此文件即是上文提到的Realm。在“tomcat-users”中加入如下用户和角色:清单2.定义用户及其角色!--Webservicesinvokerrole--rolerolename=WsInvokerRole/!--Webservicesinvokers/users--userusername=wsaxispassword=wsaxisroles=WsInvokerRole/2.打开Web应用“TomcatAxis”的部署描述符:web.xml文件,并在“web-app”中加入如下片段:清单3.配置安全资源!--configurationsforBASICAuthentication--security-constraintweb-resource-collectionweb-resource-nameAllWebservicesEndpoints/web-resource-nameurl-pattern/services/*/url-pattern/web-resource-collectionauth-constraintdescriptionWebservicesinvokersarealloweddoinginvocation/descriptionrole-nameWsInvokerRole/role-name/auth-constraint/security-constraint!--authenticationmethod--login-configauth-methodBASIC/auth-methodrealm-nameRealmofWebservicesInvokers/realm-name/login-config在“security-constraint”片段内,定义了改WebApplication需要保护的资源,可以通过“url-pattern”来定义符合一定URL样式的资源,上述片段的定义,保护了所有Webservices的endpoints。“login-config”片段定义了采取BASIC认证方式,其中“realm-name”只在BASIC认证方式下有效,它分配安全领域名,此名称供浏览器用于对话框标题,且为Authorization头部的一部分。3.重启Tomcat,骤重新测试该WebService,将有如图7提示框,提示输入用户名和密码:输入之前所定义的wsaxis用户名及其密码后,点击OK,Webservices将会被调用。否则将无法正常调用到WebService。图7.信息输入对话框测试Tomcat下BasicAuthentication通常Webservices可以有两种调用方式,即静态调用方式和动态调用方式。下面将分别介绍如何使用这两种方式验证BasicAuthentication是否正常工作。静态调用方式测试首先,新建一个JavaProject,命名为“TomcatAxisClient”,如图8图8.创建Webservices测试客户端工程其次,将前文所声称的Webservices的WSDL的URL作为参数,生成Webservices客户端,如图9图9.生成WebservicesClient完成上述操作后,将有如下结构的Webservices客户端类生成,如图10所示:图10.生成结果使用上述客户端类,就可以实现Webservices的调用。现在,需要创建一个测试类,实例化客户端类,调用WebService。类名为“sample.test.client.runable.StaticClientTest”,详细代码见清单4.清单4.静态调用类packagesample.test.client.runable;importjava.net.URL;importsample.test.ServiceImplServiceLocator;importsample.test.ServiceImplSoapBindingStub;publicclassStaticClientTest{publicstaticvoidmain(String[]args){try{//StringuserName=wsaxis,password=wsaxis;intaddend=64,augend=128;ServiceImplSoapBindingStubsisbs=newServiceImplSoapBindingStub(newURL(),newServiceImplServiceLocator());//sisbs.setUsername(userName);//sisbs.setPassword(password);System.out.println(StaticClientInvocation:\n\tThesummationis:+sisbs.sum(addend,augend));}catch(Exceptione){e.printStackTrace();}}}运行上述代码,你将发现Webservices不能够被顺利调用,此处将会抛出Webservices调用异常,如图11所示:图11.未认证时执行结果这个错误表明,你所调用的资源是受保护的,你必须提供相关的认证信息来访问它们。如果把如下代码的注释符去掉,//StringuserName=wsaxis,password=wsaxis;……/
本文标题:Webservices之安全实践
链接地址:https://www.777doc.com/doc-2867057 .html