Axis2+Rampart(WSS4J)实现UsernameToken认证方式的WS

最近一直研究SOAP消息的安全通信方式,没在网上搜到啥靠谱的,就一步一步摸索,终于成功了,把过程整理出来,供大家参考。

废话不多说,关于怎么用Axis2发布Web Service,WS-Security是啥,什么是Rampart、和WSS4J又是什么关系,SOAP消息等等的问题不是本文的重点,这里推荐一篇文章,是用Axis2+Rampart实现证书认证方式的WS-Security,写的比较好,对相关的概念也有部分介绍,必须得赞一个,一系列的文章也都写的非常好,值得细细品读。

地址:

1、服务端

最终建好的工程截图如下:

a)建立Axis2的工程

b)添加相关的Jar包,Axis2、Rampart的jar包都需要有,由于本项目中还用到了数据库,所以也添加了jdbc的jar包。

c)之后在WEB-INF/modules目录下添加rampart模块,将rampart-1.6.2.mar和rahas-1.6.2.mar两个文件直接拷过来即可。

d)之后就是在配置文件services.xml中添加rampart的配置,内容如下:

<module ref="rampart" /><!–<parameter name="OutflowSecurity"><action><items>UsernameToken</items><user>administrator</user><passwordCallbackClass>com.rampart.client.ClientAuthHandler</passwordCallbackClass></action></parameter>–><parameter name="InflowSecurity"><action><items>UsernameToken</items><passwordCallbackClass>com.rampart.WsServiceAuthHandler</passwordCallbackClass></action></parameter>

因为服务端只是对访问请求进行验证,所以对OutflowSecurity参数不做设置。InflowSecurity参数项配置里面的passwordCallbackClass需要配置自己写的回调函数的类名,代码如下:

package com.rampart;import java.io.IOException;import javax.security.auth.callback.Callback;import javax.security.auth.callback.CallbackHandler;import javax.security.auth.callback.UnsupportedCallbackException;import org.apache.log4j.Logger;import org.apache.ws.security.WSPasswordCallback;public class WsServiceAuthHandler implements CallbackHandler{private final static String USERNAME = "administrator";private final static String PASSWORD = "123456";private Logger log = Logger.getLogger(WsServiceAuthHandler.class);/*** 〈一句话功能简述〉 〈功能详细描述〉** @see javax.security.auth.callback.CallbackHandler#handle(javax.security.auth.callback.Callback[])* @param callbacks* @throws IOException* @throws UnsupportedCallbackException*/@Overridepublic void handle(Callback[] callbacks) throws IOException,UnsupportedCallbackException{WSPasswordCallback pCallback = (WSPasswordCallback) callbacks[0];// 标识符String id = pCallback.getIdentifier();// 此处获取到的password为null,但是并不代表服务端没有拿到该属性。// 这是因为客户端提交过来的密码在SOAP 消息中已经被加密为MD5// 的字符串,如果我们要在回调方法中作比较,那么第一步要做的就是把服务端准备好的密码加密为MD5 字符串,由于MD5// 算法参数不同结果也会有差别,另外,这样的工作由框架替我们完成不是更简单吗?String password = pCallback.getPassword();System.out.println("接收到WebService请求,userName[" + id + "],password["+ password + "]……");if (null == USERNAME){System.out.println("验证用户失败,原因:您没有权限访问,用户名为空!");throw new UnsupportedCallbackException(pCallback, "您没有权限访问,用户名为空!");}else if (!USERNAME.equals(id)){System.out.println("验证用户失败,原因:您没有权限访问,用户名错误!");throw new UnsupportedCallbackException(pCallback, "您没有权限访问,用户名错误!");}else{/*** 此处应该这样做:* 1. 查询数据库,得到数据库中该用户名对应密码* 2. 设置密码,wss4j会自动将你设置的密码与客户端传递的密码进行匹配* 3. 如果相同,则放行,否则返回权限不足信息*/pCallback.setPassword(PASSWORD);/** if (!PASSWORD.equals(password)) {* System.out.println("验证用户失败,原因:您没有权限访问,密码错误!"); throw new* UnsupportedCallbackException(pCallback, "您没有权限访问,密码错误!"); }*/}pCallback.setIdentifier("service");}}

具体什么什么的看注释就行了,,可以说是综合了网上能找的所有资料里面感觉有道理的说明的总和了。

e)再然后就发布服务就行了。

2、客户端

客户端的配置相对来说就比较麻烦了,一步一步来吧。

客户端只要建立普通的Java工程就行了,最终工程截图如下:

a)新建Java工程

b)同样添加相关的Jar包,Axis2、Rampart的jar包都需要有。

c)这里就在src下面新建个repository的目录,将axis2.xml文件从Axis2的conf目录下拷过来,然后再将modules目录全部拷过来。

d)之后是新建类,编写调用的客户端代码,其中的关键代码如下:

力微休负重,言轻莫劝人。

Axis2+Rampart(WSS4J)实现UsernameToken认证方式的WS

相关文章:

你感兴趣的文章:

标签云: