分享

WebServic开发之Axis权限控制

 昵称13039494 2013-10-15

发好WebService并向外暴露服务后,由于WebService访问协议都是公开的,客户端只要知道服务的wsdl,就可以访问WebService中的方法。为防止非法的访问,可以要求客户端访问WebService时提供用户名和口令,只有在服务端通过身份认证后才可继续访问方法,否则请求被拒绝。

下面看一下Axis中如何使用用户名、口令来控制对WebService 的访问。

myservices/WEB-INF下创建一个名为users.lst的文本文件,一行表示一对用户名、口令,之间用空格分隔,内容如下:

user1 password1

user2 password2

 

实现一个WebService,它有一个foo()方法,该方法打印出通过身份认证的用户的用户名,代码如下:

SecurityService.java

 

package chen.axisguide.ch6;

 

import org.apache.axis.MessageContext;

 

public class SecurityService {

       public void foo() {

             

              MessageContext msgContext = MessageContext.getCurrentContext();

              System.out.println("你已通过身份认证!");

              System.out.println("你的用户名: " + msgContext.getUsername());

             

       }

}

 

 

为了让 Axis知晓要对该服务的访问验证用户名和口令,需要在wsdd文件中增加一个Axis自带的处理器SimpleAuthenticationHandler,该处理器会从MessageContext中取出用户名和口令,并与users.lst中的用户名和口令进行比对,如果匹配,则通过验证,继续后面的处理,否则抛出(401)Unauthorized异常。

deploy.wsdd

 

<deployment xmlns="http://xml./axis/wsdd/"

            xmlns:java="http://xml./axis/wsdd/providers/java">

           

    <service name="SecurityService" provider="java:RPC" >

       <parameter name="className" value="chen.axisguide.ch6.SecurityService" />

       <parameter name="allowedMethods" value="*" />

       <requestFlow>

           <handler type="java:org.apache.axis.handlers.SimpleAuthenticationHandler" />

       </requestFlow>

    </service>

</deployment>

 

 

 

    客户端在访问WebService时,需要在 Call对象中设置在users.lst文件中已有的用户名和对应的口令。客户端代码如下:

 

 

package chen.axisguide.ch6;

 

import java.rmi.RemoteException;

 

import javax.xml.rpc.ServiceException;

 

import org.apache.axis.AxisFault;

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

 

 

/**

 * 访问SecurityService的客户端

 *

 *

 */

public class Client {

 

       /**

        * @param args

        * @throws ServiceException

        * @throws RemoteException

        */

       public static void main(String[] args) throws ServiceException, RemoteException {

              // wsdladdress 节点的location属性

              String endpoint = "http://localhost:8080/myservices/services/SecurityService";

              // 要调用的方法名

              String method = "foo";

             

              Service service = new Service();

              Call call = (Call) service.createCall();

              // 设置客户端访问的远程端点

              call.setTargetEndpointAddress(endpoint);

              // 设置用户名和口令

              call.setUsername("user1");

              call.setPassword("password1");

      

             

              // 调用远程方法

              try{

                     call.invoke(method,new Object[]{});

              }catch(AxisFault e) {

                     System.err.println(e.getFaultString());

              }

       }

 

}

        Call对象用setUserName()setPassword()来设置用户名和口令。

        Axis自带的身份认证功能比较简单,如果其安全性不能满足应用系统的要求,可以自定义一个处理器替代SimpleAuthenticationHandler,在自定义处理器中采用其他的安全框架(如Acegi http://www./)来保护你的WebService.

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多