XFire Web Service验证方案
HttpServletResponse response = XFireServletController.getResponse();
此条路不通只好去查XFire的文档关于authentication部分,大概有以下几种方案:
- HTTP Authentication
- SOAP Header authentication with JSR181
- SOAP authentication with handlers
- WS-Security
// Create your client
Client client = ....;
// Or get it from your proxy
Client client = ((XFireProxy) Proxy.getInvocationHandler(myClientProxy)).getClient();
client.setProperty(Channel.USERNAME, "username");
client.setProperty(Channel.PASSWORD, "pass");
去忘了写服务端应该怎么做,这个username和password该在那里验证呢??我翻遍了文档也没找着
来看第二条SOAP header authentication with JSR181,看起来倒是很简单
但是在Service的代码中每个方法里都要写一个UserToken验证的参数,虽然似乎权限粒度能控制得很细,但是这严重污染了业务逻辑的代码,非常的不优雅,放弃!
public void someOperation(String data, @WebParam(header=true) UserToken token) {
authenticate(token)
// do your normal request here
}
再看WS-Security,这是webservice的安全标准,但实在太复杂了,并且需要配置Service.xml,我们项目是Java1.5,Service.xml根本就没有写,是自动生成的,我是实在找不到Service.xml该在那配置?只好作罢
文档里遗漏了很重要的一点,就是关于如何在xfire-servlet里配置,导致很多人看了文档也进行不下去,我查了很久才在老外的一篇blog里找到一点tips,下面是配置:
<!-- WebService base, do not modify it -->
<bean id="webService" class="org.codehaus.xfire.spring.remoting.XFireExporter" abstract="true">
<property name="serviceFactory">
<ref bean="xfire.serviceFactory" />
</property>
<property name="xfire">
<ref bean="xfire" />
</property>
</bean>
<bean id="yourWebService" parent="webService">
<property name="serviceBean">
<ref bean="yourService" />
</property>
<property name="serviceClass">
<value>your.package.YourServiceInterface</value>
</property>
<property name="inHandlers">
<ref bean="authenticationHandler"/>
</property>
</bean>
AuthenticationHandler需要修改一下,其他不用变:
AuthenticationHandler.java
import org.apache.log4j.Logger;
import org.codehaus.xfire.MessageContext;
import org.codehaus.xfire.handler.AbstractHandler;
import org.codehaus.xfire.fault.*;
import org.jdom.*;
public class AuthenticationHandler extends AbstractHandler {
private static final Logger log = Logger.getLogger(AuthenticationHandler.class);
public void invoke(MessageContext context) throws Exception {
log.info("authentication handler is invoked");
if (context.getInMessage().getHeader() == null)
{
throw new XFireFault("Request must include company authentication token.",
XFireFault.SENDER);
}
Element header = context.getInMessage().getHeader();
Element token = header.getChild("AuthenticationToken");
if (token == null)
{
throw new XFireFault("Request must include authentication token.",
XFireFault.SENDER);
}
String username = token.getChild("Username").getText();
String password = token.getChild("Password").getText();
try {
// 现在你已经得到了客户端传来的username和password,那就验证它吧(可以交给acegi来验证)
}
}catch(Exception e) {
log.warn(e);
throw new XFireFault("Authentication Failed.",
XFireFault.SENDER);
}
}
}
客户端代码:
YourService service = (YourService) new XFireProxyFactory().create(serviceModel,
"http://localhost:8080/YourProject/service/YourService");
Client client = proxy.getClient();
client.addOutHandler(new ClientAuthHandler("jeffrey", "killjava"));
// 执行下面代码会进行验证
service.someOperation();
发表评论
- 浏览: 115726 次
- 性别:

- 来自: 合肥

- 详细资料
搜索本博客
我的相册
共 11 张
最近加入圈子
最新评论
-
JavaEE是否适合互联网开发 ...
laiseeme 写道stack3256 写道大量的开源框架和解决方案 一个成熟 ...
-- by liusong1111 -
JavaEE是否适合互联网开发 ...
stack3256 写道大量的开源框架和解决方案 一个成熟的Java程序员和成熟 ...
-- by laiseeme -
JavaEE是否适合互联网开发 ...
校内也是java做的,貌似看见.do的字样。最近也打算写个,但是不想用j2ee了 ...
-- by jkfzero -
JavaEE是否适合互联网开发 ...
大量的开源框架和解决方案 一个成熟的Java程序员和成熟的PHP程序员效率会差多 ...
-- by stack3256 -
JavaEE是否适合互联网开发 ...
互联网应用也看是干啥的吧!几个人就能搞定的小站还用上JAVA这个大炮呀。当然上了 ...
-- by ebeach






评论排行榜