。
清单 5 展示了回调类的实际实现,用于明文形式的密码。在本例中,用户名和密码都被提供给回调, 并且所有回调只需要检验用户名和密码组合。如果用户名和密码匹配预期值,那么返回即可;否则,将抛 出一个异常表示出错。
清单 5. 密码回调代码
import org.apache.ws.security.WSPasswordCallback;
public class PWCBHandler implements CallbackHandler
{
public void handle(Callback[] callbacks)
throws IOException, UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
WSPasswordCallback pwcb = (WSPasswordCallback)callbacks[i];
String id = pwcb.getIdentifer();
if (pwcb.getUsage() == WSPasswordCallback.USERNAME_TOKEN_UNKNOWN) {
// used when plain-text password in message
if (!"libuser".equals(id) || !"books".equals(pwcb.getPassword())) {
throw new UnsupportedCallbackException(callbacks[i], "check failed");
}
}
}
}
}
对于一个真正的应用程序,您肯定希望使用其他一些机制(比如数据库或外部安全机制)来检验用户 名和密码组合。回调技术可以让您使用任何检查技巧来扩展 Rampart 安全处理。
客户端配置
要对客户机代码使用 Rampart,首先需要对 Axis2 使用模块。方法就是针对客户机配置一个 Axis2 库结构,但是更简单的方法是在您的类路径中包含 rampart.mar 模块文件(以及需要使用的其他模块) 。提供的示例使用了类路径方法。
然后需要为客户机配置安全模块和其他相关参数。处理此配置的最简单方法就是直接在服务 stub 上 设置值。清单 6 展示了示例代码中的配置过程:
Java Web 服务: Axis2 WS-Security基础(6)
时间:2011-10-02 ibm Dennis Sosnoski
清单 6. 客户机配置
/**
* Load policy file from classpath.
*/
private static Policy loadPolicy(String name) throws XMLStreamException {
ClassLoader loader = WebServiceClient.class.getClassLoader();
InputStream resource = loader.getResourceAsStream(name);
StAXOMBuilder builder = new StAXOMBuilder(resource);
return PolicyEngine.getPolicy (builder.getDocumentElement());
}
public static void main(String[] args) throws IOException, XMLStreamException {
// check for required command line parameters
if (args.length < 4) {
System.out.println("Usage:\n java " +
"com.sosnoski.ws.library.adb.WebServiceClient protocol host port path");
System.exit(1);
}
// create the client stub
String target = args[0] + "://" + args[1] + ":" + args[2] + args[3];
System.out.println("Connecting to " + target);
LibraryUsernameStub stub = new LibraryUsernameStub(target);
// configure and engage Rampart
ServiceClient client = stub._getServiceClient();
Options options = client.getOptions();
options.setProperty (RampartMessageData.K
|