webservice的安全机制2---handler实现

来源:互联网 发布:访问nginx图片显示404 编辑:程序博客网 时间:2024/05/22 15:54

本节摘要:本节介绍使用handler的方式来实现webservice的IP地址的校验。

 

1.引言

前一节介绍了使用users.lst文件来实现webservice的用户名和密码的校验,

本节介绍使用webservice的handler来实现webservice的安全校验。

这里,不用用户名和密码来实现安全校验,换一种方式,采用IP地址校验的方式。

这里通过一个配置文件来控制是否打开IP校验开关以及允许哪些IP地址的客户端可以访问。 

这里的开发还是基于上一节HelloService这个基本的webservice基础上来开发。

 

2.项目环境

   system:win7   

   myeclipse:6.5 tomcat:5.0  JDK:开发环境1.5,编译环境1.4

  axis:1.4

  项目结构图如下:

 

3.示例代码

配置文件

web.xml---web项目的配置文件,和基本的webservice配置没任何区别

web.xml
 1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.4"  3     xmlns="http://java.sun.com/xml/ns/j2ee"  4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  5     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee  6     http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 7  8        <servlet> 9         <servlet-name>AxisServlet</servlet-name>10         <servlet-class>11             org.apache.axis.transport.http.AxisServlet12         </servlet-class>13     </servlet>14     <servlet-mapping>15         <servlet-name>AxisServlet</servlet-name>16         <url-pattern>/services/*</url-pattern>17     </servlet-mapping>18     19 </web-app>

server-config.wsdd---axis的配置文件,这里的配置就是一个webservice+handler的基本配置

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      <!-- 配置一个handler,用来进行IP校验-->70     <handler name="IPHandler" type="java:server.handler.IpAuthentionHandler">71         <parameter name="status" value="success" />72     </handler>73      74 75     <!-- 配置自己的服务 -->76     <service name="HelloService" provider="java:RPC">77         <parameter name="allowedMethods" value="*" />78         <parameter name="className" value="server.service.HelloServiceImpl" />79 80         <!-- 引入IP校验的handler -->81         <requestFlow>82             <handler type="IPHandler" />83         </requestFlow>84 85     </service>86 87 </deployment>

 

服务端文件

服务类:

HelloServiceImpl.java

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 }

handler处理类和配置文件:

IpAuthentionHandler.java

IpAuthentionHandler.java
 1 package server.handler; 2  3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.util.Properties; 6 import java.util.regex.Pattern; 7  8 import javax.servlet.http.HttpServletRequest; 9 10 import org.apache.axis.AxisFault;11 import org.apache.axis.MessageContext;12 import org.apache.axis.handlers.BasicHandler;13 import org.apache.axis.transport.http.HTTPConstants;14 import org.apache.axis.utils.Messages;15 16 //利用handler进行客户端IP校验17 public class IpAuthentionHandler extends BasicHandler {18 19     private static final long serialVersionUID = 1L;20     21     private static Properties p = new Properties();22 23     static {24         InputStream in = null;25         try {26             //注意这里的文件的存放位置和文件路径的书写方式; path 不以'/'开头时默认是从此类所在的包下取资源27             //这里如果我们把ip.properties放在src根目录下,然后采用src/ip.properties的形式是没法取到此文件的;28             //此时需要使用        in=IpAuthentionHandler.class.getClassLoader().getResourceAsStream("ip.properties");29             in = IpAuthentionHandler.class.getResourceAsStream("ip.properties");            30             p.load(in);31         } catch (IOException e) {32             System.out.println("ip.properties配置文件加载失败!");33             e.printStackTrace();34         } finally {35             if (null != in)36                 try {37                     in.close();38                 } catch (IOException e) {39                     System.out.println("关闭流操作发生异常!");40                     e.printStackTrace();41                 }42         }43     }44 45     public void invoke(MessageContext messageContext) throws AxisFault {46         String status=(String)this.getOption("status");47         System.out.println("IpAuthentionHandler's  status is :"+status);48 49         String uri = messageContext.getSOAPActionURI();50         String targetService = messageContext.getTargetService();51 52         System.out.println("webservice开始IP认证:service>>" + uri + "/"+ targetService);53         String name = HTTPConstants.MC_HTTP_SERVLETREQUEST;54 55         HttpServletRequest request = (HttpServletRequest) messageContext56                 .getProperty(name);57         String remoteAddr = request.getRemoteAddr();58         System.out.println("客户端IP:" + remoteAddr);59 60         String switcher = p.getProperty("ip_switcher");61         System.out.println("IP校验开关:" + switcher);62 63         if ("on".equalsIgnoreCase(switcher)) {64             System.out.println("服务端IP校验开关处于【打开】状态,需要校验IP");65 66             String regx = p.getProperty("ip_allow");67             System.out.println("允许调用服务的IP地址有:" + regx);68 69             if (null != regx && regx.length() > 0) {70 71                 String regxArray[] = regx.split(",");72                 boolean ip_check = false;73                 for (int i = 0; i < regxArray.length; i++) {74                     Pattern p = Pattern.compile(regxArray[i]);75                     boolean flag = p.matcher(remoteAddr).find();76                     if (flag) {77                         ip_check = true;78                         break;79                     }80                 }81 82                 if (ip_check) {83                     System.out.println("IP校验通过!");84                 } else {85                     throw new AxisFault("",Messages.getMessage("wrong ip:"+remoteAddr),null,null);86                 }87             } else {88                 System.out.println("请指定校验的客户端IP!");89                 throw new AxisFault();90             }91         } else if ("off".equalsIgnoreCase(switcher)) {92             System.out.println("服务端IP校验开关处于【关闭】状态,不需要校验IP");93         }94     }95     96 }

ip.properties

ip.properties
1 ##################################IP校验配置##################################2 #IP校验开关 只能填写on或者off,不区分大小写3 ip_switcher=on4 5 #允许调用对应的webservice服务的客户端IP地址 多个IP地址之间用逗号隔开6 #当ip校验开关打开的时候,必须配置IP地址7 ip_allow=10.10.147.124,10.10.147.123,127.0.0.18 9 ##################################IP校验配置##################################

 

客户端文件

Test1.java

Test1.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 Test1 {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/WebService05_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 }

 

验证结果

发布工程,启动tomcat服务器:

1.看webservice在浏览器中是否可以正常显示

在浏览器中输入wsdl地址:

                http://localhost:8080/WebService05_Security/services/HelloService?wsdl

 

2.运行webservice客户端,看是否可以正常的访问

   目前IP配置文件中开关是打开的,并且127.0.0.1是允许访问此webservice服务的

  运行后客户端和服务端日志分别如下:

  

  

 3.模拟不能正常访问的IP地址的调用情况

    把ip.properties文件中的

      ip_allow=10.10.147.124,10.10.147.123,127.0.0.1

    改为:

      ip_allow=10.10.147.124,10.10.147.123

然后,重新发布项目,启动tomcat:

此时客户端和服务端的日志如下(此时需要时间稍微长一点,客户端才会出现以下异常):

0 0