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" />
前面的那种方法是认为用户一上来就是非法用户,后一种方法是认为用户是合法的。