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

2024-09-07 17:38

本文主要是介绍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

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

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

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文件中增加验证的配置

    修改后完整的文件如下:

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)在客户端请求代码中加入用户名和密码

    添加用户名和密码后完整的文件如下:

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         //-----------------------------采用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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1145712

相关文章

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

Idea调用WebService的关键步骤和注意事项

《Idea调用WebService的关键步骤和注意事项》:本文主要介绍如何在Idea中调用WebService,包括理解WebService的基本概念、获取WSDL文件、阅读和理解WSDL文件、选... 目录前言一、理解WebService的基本概念二、获取WSDL文件三、阅读和理解WSDL文件四、选择对接

MySQL中的锁和MVCC机制解读

《MySQL中的锁和MVCC机制解读》MySQL事务、锁和MVCC机制是确保数据库操作原子性、一致性和隔离性的关键,事务必须遵循ACID原则,锁的类型包括表级锁、行级锁和意向锁,MVCC通过非锁定读和... 目录mysql的锁和MVCC机制事务的概念与ACID特性锁的类型及其工作机制锁的粒度与性能影响多版本

Spring使用@Retryable实现自动重试机制

《Spring使用@Retryable实现自动重试机制》在微服务架构中,服务之间的调用可能会因为一些暂时性的错误而失败,例如网络波动、数据库连接超时或第三方服务不可用等,在本文中,我们将介绍如何在Sp... 目录引言1. 什么是 @Retryable?2. 如何在 Spring 中使用 @Retryable

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

客户案例:安全海外中继助力知名家电企业化解海外通邮困境

1、客户背景 广东格兰仕集团有限公司(以下简称“格兰仕”),成立于1978年,是中国家电行业的领军企业之一。作为全球最大的微波炉生产基地,格兰仕拥有多项国际领先的家电制造技术,连续多年位列中国家电出口前列。格兰仕不仅注重业务的全球拓展,更重视业务流程的高效与顺畅,以确保在国际舞台上的竞争力。 2、需求痛点 随着格兰仕全球化战略的深入实施,其海外业务快速增长,电子邮件成为了关键的沟通工具。

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提