Web Service之Handler的验证和授权

本文介绍了如何使用Handler在Web Service中实现验证和授权。通过自定义AuthenticationHandler和AuthorizationHandler,确保只有授权的用户能访问服务。详细阐述了在服务端和客户端的配置及代码实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Handler的验证和授权

Handler就是一个普通的过滤器,对服务过滤,只给允许使用的用户授予操作的权限,比如银行的取款,不是每个人都能随便取款的。

 

在服务端的项目里面编写以下代码

 

AuthenticationHandler.java

 

import org.apache.axis.AxisFault;

import org.apache.axis.MessageContext;

import org.apache.axis.handlers.BasicHandler;

import org.apache.axis.security.AuthenticatedUser;

import org.apache.axis.security.SecurityProvider;

import org.apache.axis.security.simple.SimpleSecurityProvider;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

 

publicclassAuthenticationHandler extends BasicHandler {

   Loglog= LogFactory.getLog(AuthenticationHandler.class) ;

   //定义认证的参数信息

   StringsecurityProvider= "securityProvider" ;//安全级别对象

   Stringunauthenticated= "unauthenticated" ;//未认证

   StringauthenticatedUser= "authenticatedUser" ;//认证

   StringcanAuth= "canAuth"; //认证的用户

   publicvoid invoke(MessageContextmsgcontext) throwsAxisFault {

     log.info("AuthenticationHandler:invoke start") ;

     //获取当前的安全服务

     SecurityProviderprovider = (SecurityProvider) msgcontext.getProperty(securityProvider) ;

     //判断当前的安全机制状态

     if(provider == null){

        //创建一个安全的级别

        provider= newSimpleSecurityProvider() ;

        //将创建的安全级别设置到当前的webservice

        msgcontext.setProperty(securityProvider, provider) ;

     }

     if(provider != null){

        //获取当前webservice的认证信息

        Stringuserid = msgcontext.getUsername() ;

        Stringpassword = msgcontext.getPassword() ;

        log.info(userid + " " + password) ;

        //对访问的用户进行认证

        AuthenticatedUserauthUser = provider.authenticate(msgcontext) ;//获取预先设置的用户信息

        if(authUser == null){

           thrownew AxisFault(unauthenticated,"error",null,null) ;

        }

        //用户通过认证,将用户设置为认证用户

        msgcontext.setProperty(authenticatedUser,authUser) ;

     }

     log.info("AuthenticationHandler: invoke end") ;

   }

 

}

 

到tomcat的webapps à axis àWEB-INF的users.lst文件。

打开此文件

user1 pass1

user2

user3 pass3

xin 123456

每一行代表一个用户,前一个字段是用户名,后一个字段是密码。

 

接着就是配置服务了……

把前面的信息稍微修改一下就行了:

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

              <parametername="className" value="com.webservice.anni.HandlerService"/>

              <parametername="allowedMethods" value="*" />

              <parametername="allowedRoles" value="user1,xin"/>

              <requestFlow>

                     <handler name="authen"type="java:com.webservice.anni.AuthenticationHandler" />

                     <handlername="logging"type="java:com.webservice.anni.LogHandler">

                            <parametername="filename" value="C:\tomcat7.0\MyService.log"/>

                     </handler>

              </requestFlow>

       </service>

 

编写客户端这边的程序:

 

import java.net.URL;

 

import javax.xml.namespace.QName;

 

import org.apache.axis.client.Call;

import org.apache.axis.client.Service;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

 

publicclassAuthenClient {

   publicstaticvoid main(String[] args) throws Exception {

     Loglog = LogFactory.getLog(AuthenClient.class) ;

     Stringurl = "http://localhost:8089/axis/services/HandlerService" ;

     Serviceservice = newService() ;

     Callcall = (Call) service.createCall() ;

     call.setTargetEndpointAddress(new URL(url)) ;

     call.setOperationName(new QName("HandlerService","publicMethod"));

     //由于当前的webservice方法,添加认证的信息,设置访问的权限

     call.getMessageContext().setUsername("xin") ;

     call.getMessageContext().setPassword("123456");

     Stringres = (String) call.invoke(new Object[]{"Authen Message"}) ;

     log.info(res);

   }

}

 

开启tomcat,运行,控制台出现如下信息:

HelloAuthen Message

合法用户的信息。

把用户名或者密码修改一下,就会报错,说明没有这个权限。

Exception in thread"main" AxisFault

 faultCode:{http://xml.apache.org/axis/}unauthenticated

 faultSubcode:

 faultString: error

 faultActor:

 faultNode:

 faultDetail:

   {http://xml.apache.org/axis/}hostname:xin

 

error

 

现在做handler授权

 

import java.util.StringTokenizer;

 

import org.apache.axis.AxisFault;

import org.apache.axis.Handler;

import org.apache.axis.MessageContext;

import org.apache.axis.handlers.BasicHandler;

import org.apache.axis.i18n.Messages;

import org.apache.axis.security.AuthenticatedUser;

import org.apache.axis.security.SecurityProvider;

import org.apache.commons.logging.Log;

import org.apache.commons.logging.LogFactory;

 

publicclassAuthorizationHandler extends BasicHandler {

   Loglog= LogFactory.getLog(AuthorizationHandler.class) ;

   publicvoid invoke(MessageContextmsgContext) throwsAxisFault {

     log.info("start……");

     //创建一个认证用户--授权用户

     AuthenticatedUseruser = (AuthenticatedUser) msgContext.getProperty("authenticatedUser") ;

     if(user == null){

        thrownew AxisFault("Server not User",Messages.getMessage("needUser00"),null,null) ;

     }

     //从认证用户中,获取用户名

     Stringuserid = user.getName() ;

     //获取当前的服务

     HandlerserviceHandler = msgContext.getService() ;

     //判断当前是否存在webservice

     if(serviceHandler == null){

        thrownew AxisFault(Messages.getMessage("needService00"));

     }

     //获取服务名

     Stringservicename = serviceHandler.getName() ;

     //生成访问角色信息

     StringallowedRoles = (String) serviceHandler.getOption("allowedRoles") ;

     if(allowedRoles == null){

        log.info("不需要验证") ;

        return ;

     }

     //开始授权,验证

     SecurityProviderprovider = (SecurityProvider) msgContext.getProperty("securityProvider") ;

     if(provider == null){

        thrownew AxisFault(Messages.getMessage("noSecurity00"));

     }

     //根据allowedRoles字符串,进行验证

     for(StringTokenizer st = newStringTokenizer(allowedRoles,",");st.hasMoreTokens();){

        //获取第一个roles信息

        StringthisRoles = st.nextToken() ;

        //比对

        if(provider.userMatches(user,thisRoles)){

           log.info("通过验证") ;

           return ;

        }

     }

     //没有通过验证和授权,不能访问目标的服务

     thrownew AxisFault("Server unauthenticated",Messages.getMessage("canAuth02"),null,null) ;

   }

}

 

在server-config.wsdd文件里面添加这一句:

<handler name="authen"type="java:com.webservice.anni.AuthorizationHandler" />

 

前面的那种方法是认为用户一上来就是非法用户,后一种方法是认为用户是合法的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值