webservice的安全机制1---users.lst

来源:互联网 发布:excel数据透视表计数项 编辑:程序博客网 时间:2024/05/17 22:17

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" />            <handler                type="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";// 请求服务的URL23         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方法调用webservice35         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             <handler48                 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";// 请求服务的URL23         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方法调用webservice41         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.在客户端访问时增加用户名和密码的设置;

0 0
原创粉丝点击