本文主要是介绍webservice的安全机制1---users.lst,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本节摘要:本节主要介绍webservice的安全机制。
1.引言
俗话说,安全第一;
那么,我们软件中是否有安全,安全是否重要呢?
sure,软件开发中当然也有安全,安全显得尤为重要。
本节,我们将一起来看看webservice的安全问题。
之前在前几节中写了webservice开发相关的知识,接下来几节我会写webservice安全相关的问题。
闲扯一点,
本来这部分在上个月就准备写的,但是确实是太忙了,每天加班,晚上回到家都快十一点了,偶尔还要通宵去上线,周末还要去奋战一天,实在是没那个精力,乘着今天下班早点,就来写写了,写博客也是我喜欢的事情嘛。
2.webservice安全机制分类
首先声明,这里的分类不一定准确,只是我站在目前的高度,对能了解到的,能想到的做一个简单的分类;再者,这里的分类都是站在代码的角度来写的,至于你说的防火墙、DMZ....这些都不在我的考虑范围之内。
(1)对webservice发布的方法,方法名称和参数不要使用望文生义的描述;
(2)对webservice发布的方法,在入参中增加一个或多个字符串序列;
这里的字符串可以要求必须满足指定的格式,同时字符串可以再通过客户端传参数的时候加密,服务端解密;
(3)对webservice发布的方法,入参中加上用户名和密码,然后服务端通过数据库校验;
(4)对webservice发布的方法,通过handler/chain方式来实现验证(用户名&密码校验/IP地址校验等);
(5)对webservice发布的方法,采用webservice的users.lst来进行验证;
(6)对webservice发布的服务,通过servlet的Filter来实现验证;
(7)对webservice传输过程中的数据进行加密;
(8)自己写校验框架来实现webservice的安全;
(9)其它方式......
各位大虾,认为还有哪些比较好的方式,欢迎指出。
3.webservice安全实现
既然webservice的安全方式有那么多种,那么具体是怎么实现的呢?
接下来几节,我会介绍webservice采用users.lst、chain、Filter实现webservice的方式;本节,就来介绍一下最简单的,采用webservice自带的users.lst的方式。
3.1开发一个基本的webservice
项目结构图如下:
(1)服务端代码:
HelloServiceImpl.java
1 package server.service; 2 3 public class HelloServiceImpl { 4 5 public String hello(String s) { 6 System.out.println("我是服务端......"); 7 System.out.println("方法的入参为:"+s); 8 return "hello," + s; 9 } 10 }
(2)服务端wsdd文件的配置
server-config.wsdd
<?xml version="1.0" encoding="UTF-8"?> <deployment xmlns="http://xml.apache.org/axis/wsdd/"xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"><globalConfiguration><parameter name="sendMultiRefs" value="true" /><parameter name="disablePrettyXML" value="true" /><parameter name="adminPassword" value="admin" /><parameter name="attachments.Directory"value="D:\tomcat5\webapps\WebService\WEB-INF\attachments" /><parameter name="dotNetSoapEncFix" value="true" /><parameter name="enableNamespacePrefixOptimization"value="false" /><parameter name="sendXMLDeclaration" value="true" /><parameter name="sendXsiTypes" value="true" /><parameter name="attachments.implementation"value="org.apache.axis.attachments.AttachmentsImpl" /><requestFlow><handler type="java:org.apache.axis.handlers.JWSHandler"><parameter name="scope" value="session" /></handler><handler type="java:org.apache.axis.handlers.JWSHandler"><parameter name="scope" value="request" /><parameter name="extension" value=".jwr" /></handler></requestFlow></globalConfiguration><handler name="LocalResponder"type="java:org.apache.axis.transport.local.LocalResponder" /><handler name="URLMapper"type="java:org.apache.axis.handlers.http.URLMapper" /><handler name="Authenticate"type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" /><service name="AdminService" provider="java:MSG"><parameter name="allowedMethods" value="AdminService" /><parameter name="enableRemoteAdmin" value="false" /><parameter name="className" value="org.apache.axis.utils.Admin" /><namespace>http://xml.apache.org/axis/wsdd/</namespace></service><service name="Version" provider="java:RPC"><parameter name="allowedMethods" value="getVersion" /><parameter name="className" value="org.apache.axis.Version" /></service><transport name="http"><requestFlow><handler type="URLMapper" /><handlertype="java:org.apache.axis.handlers.http.HTTPAuthHandler" /></requestFlow><parameter name="qs:list"value="org.apache.axis.transport.http.QSListHandler" /><parameter name="qs:wsdl"value="org.apache.axis.transport.http.QSWSDLHandler" /><parameter name="qs.list"value="org.apache.axis.transport.http.QSListHandler" /><parameter name="qs.method"value="org.apache.axis.transport.http.QSMethodHandler" /><parameter name="qs:method"value="org.apache.axis.transport.http.QSMethodHandler" /><parameter name="qs.wsdl"value="org.apache.axis.transport.http.QSWSDLHandler" /></transport><transport name="local"><responseFlow><handler type="LocalResponder" /></responseFlow></transport><!-- 配置自己的服务 --><service name="HelloService" provider="java:RPC"><parameter name="allowedMethods" value="*" /><parameter name="className"value="server.service.HelloServiceImpl" /></service></deployment>
(3)客户端代码
Test.java
1 package client; 2 3 import java.net.URL; 4 5 import javax.xml.rpc.ParameterMode; 6 7 import org.apache.axis.client.Call; 8 import org.apache.axis.encoding.XMLType; 9 10 public class Test { 11 12 public static void main(String args[]) throws Exception { 13 webservice_user(); 14 } 15 16 public static void webservice_user() throws Exception { 17 18 // 1.创建service对象,通过axis自带的类创建 19 org.apache.axis.client.Service service = new org.apache.axis.client.Service(); 20 21 // 2.创建url对象 22 String wsdlUrl = "http://localhost:8080/WebService06_Security/services/HelloService?wsdl";// 请求服务的URL 23 URL url = new URL(wsdlUrl);// 通过URL类的构造方法传入wsdlUrl地址创建URL对象 24 25 // 2.创建服务方法的调用者对象call,设置call对象的属性 26 Call call = (Call) service.createCall(); 27 call.setTargetEndpointAddress(url);// 给call对象设置请求的URL属性 28 String serviceName = "hello";// webservice的方法名 29 call.setOperationName(serviceName);// 给call对象设置调用方法名属性 30 call.addParameter("s", XMLType.XSD_STRING, ParameterMode.IN);// 给call对象设置方法的参数名、参数类型、参数模式 31 call.setReturnType(XMLType.SOAP_STRING);// 设置调用方法的返回值类型 32 // call.setTimeout(new Integer(200));//设置超时限制 33 34 // 4.通过invoke方法调用webservice 35 String str = new String("pantp"); 36 String dept = (String) call.invoke(new Object[] { str });// 调用服务方法 37 38 // 5.打印返回结果 39 System.out.println("我是客户端......."); 40 System.out.println(dept); 41 } 42 43 }
3.2测试开发的webservice
启动tomcat,发布工程。
在浏览器中输入wsdl地址,运行结果图如下:
运行Test.java类:
(1)客户端日志
(2)服务端日志
3.3加上users.lst的验证
(1)增加users.lst文件
在工程的WEB-INF目录下新建文件users.lst,文件内容如下:
(2)在 server-config.wsdd文件中增加验证的配置
修改后完整的文件如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <deployment xmlns="http://xml.apache.org/axis/wsdd/" 3 xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> 4 <globalConfiguration> 5 <parameter name="sendMultiRefs" value="true" /> 6 <parameter name="disablePrettyXML" value="true" /> 7 <parameter name="adminPassword" value="admin" /> 8 <parameter name="attachments.Directory" 9 value="D:\tomcat5\webapps\WebService\WEB-INF\attachments" /> 10 <parameter name="dotNetSoapEncFix" value="true" /> 11 <parameter name="enableNamespacePrefixOptimization" 12 value="false" /> 13 <parameter name="sendXMLDeclaration" value="true" /> 14 <parameter name="sendXsiTypes" value="true" /> 15 <parameter name="attachments.implementation" 16 value="org.apache.axis.attachments.AttachmentsImpl" /> 17 <requestFlow> 18 <handler type="java:org.apache.axis.handlers.JWSHandler"> 19 <parameter name="scope" value="session" /> 20 </handler> 21 <handler type="java:org.apache.axis.handlers.JWSHandler"> 22 <parameter name="scope" value="request" /> 23 <parameter name="extension" value=".jwr" /> 24 </handler> 25 </requestFlow> 26 </globalConfiguration> 27 <handler name="LocalResponder" 28 type="java:org.apache.axis.transport.local.LocalResponder" /> 29 <handler name="URLMapper" 30 type="java:org.apache.axis.handlers.http.URLMapper" /> 31 <handler name="Authenticate" 32 type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" /> 33 <service name="AdminService" provider="java:MSG"> 34 <parameter name="allowedMethods" value="AdminService" /> 35 <parameter name="enableRemoteAdmin" value="false" /> 36 <parameter name="className" value="org.apache.axis.utils.Admin" /> 37 <namespace>http://xml.apache.org/axis/wsdd/</namespace> 38 </service> 39 <service name="Version" provider="java:RPC"> 40 <parameter name="allowedMethods" value="getVersion" /> 41 <parameter name="className" value="org.apache.axis.Version" /> 42 </service> 43 44 <transport name="http"> 45 <requestFlow> 46 <handler type="URLMapper" /> 47 <handler 48 type="java:org.apache.axis.handlers.http.HTTPAuthHandler" /> 49 </requestFlow> 50 <parameter name="qs:list" 51 value="org.apache.axis.transport.http.QSListHandler" /> 52 <parameter name="qs:wsdl" 53 value="org.apache.axis.transport.http.QSWSDLHandler" /> 54 <parameter name="qs.list" 55 value="org.apache.axis.transport.http.QSListHandler" /> 56 <parameter name="qs.method" 57 value="org.apache.axis.transport.http.QSMethodHandler" /> 58 <parameter name="qs:method" 59 value="org.apache.axis.transport.http.QSMethodHandler" /> 60 <parameter name="qs.wsdl" 61 value="org.apache.axis.transport.http.QSWSDLHandler" /> 62 </transport> 63 <transport name="local"> 64 <responseFlow> 65 <handler type="LocalResponder" /> 66 </responseFlow> 67 </transport> 68 69 <!-- 配置自己的服务 --> 70 <service name="HelloService" provider="java:RPC"> 71 <parameter name="allowedMethods" value="*" /> 72 <parameter name="className" 73 value="server.service.HelloServiceImpl" /> 74 75 <!-- ===================采用webservice的users.lst的安全机制增加的配置部分 --> 76 <!-- 采用axis默认的handler来进行访问权限的控制 --> 77 <requestFlow> 78 <handler name="SimpleAuthenticationHandler" 79 type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" /> 80 </requestFlow> 81 <!-- ===================采用webservice的users.lst的安全机制增加的配置部分 --> 82 83 </service> 84 85 </deployment>
(3)在客户端请求代码中加入用户名和密码
添加用户名和密码后完整的文件如下:
1 package client; 2 3 import java.net.URL; 4 5 import javax.xml.rpc.ParameterMode; 6 7 import org.apache.axis.client.Call; 8 import org.apache.axis.encoding.XMLType; 9 10 public class Test { 11 12 public static void main(String args[]) throws Exception { 13 webservice_user(); 14 } 15 16 public static void webservice_user() throws Exception { 17 18 // 1.创建service对象,通过axis自带的类创建 19 org.apache.axis.client.Service service = new org.apache.axis.client.Service(); 20 21 // 2.创建url对象 22 String wsdlUrl = "http://localhost:8080/WebService06_Security/services/HelloService?wsdl";// 请求服务的URL 23 URL url = new URL(wsdlUrl);// 通过URL类的构造方法传入wsdlUrl地址创建URL对象 24 25 // 2.创建服务方法的调用者对象call,设置call对象的属性 26 Call call = (Call) service.createCall(); 27 call.setTargetEndpointAddress(url);// 给call对象设置请求的URL属性 28 String serviceName = "hello";// webservice的方法名 29 call.setOperationName(serviceName);// 给call对象设置调用方法名属性 30 call.addParameter("s", XMLType.XSD_STRING, ParameterMode.IN);// 给call对象设置方法的参数名、参数类型、参数模式 31 call.setReturnType(XMLType.SOAP_STRING);// 设置调用方法的返回值类型 32 // call.setTimeout(new Integer(200));//设置超时限制 33 34 //-----------------------------采用webservice的users.lst的安全机制增加的------------------------------------- 35 //此处的用户名和密码对应WEB-INF目录下users.lst文件中的用户名和密码 36 call.getMessageContext().setUsername("pantp"); 37 call.getMessageContext().setPassword("123456"); 38 //-----------------------------采用webservice的users.lst的安全机制增加的------------------------------------- 39 40 // 4.通过invoke方法调用webservice 41 String str = new String("pantp"); 42 String dept = (String) call.invoke(new Object[] { str });// 调用服务方法 43 44 // 5.打印返回结果 45 System.out.println("我是客户端......."); 46 System.out.println(dept); 47 } 48 49 }
3.4测试webservice通过users.lst实现的安全机制
(1)输入正确的用户名和密码
客户端日志:
服务端日志:
(2)输入错误的用户名或密码
客户端日志:
服务端日志:
后台没有任何日志输出;
总结:
开发通过webservice自带的验证机制实现步骤如下:
1.先不考虑安全机制的问题,开发一个需要的webservice服务和客户端,并测试通过;
2.在WEB-INF目录下新建一个文件users.lst,文件名必须一模一样,然后在文件中加入允许的用户名和密码;
3.在wsdd配置文件中对应的服务中加入SimpleAuthenticationHandler的配置;
4.在客户端访问时增加用户名和密码的设置;
这篇关于webservice的安全机制1---users.lst的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!