为 WS-Security 开发密码回调处理程序
在 Liberty 中,可以在许多 WS-Security 方案中使用密码回调处理程序来检索密码。例如,可以检索密码以生成 UsernameToken、打开密钥库或者访问专用密钥。当您使用 PasswordDigest 时,提供者需要密码回调处理程序。必须将密码回调处理程序打包为 Liberty 中的用户功能部件。
关于此任务
此任务描述如何开发密码回调处理程序以检索用户名和密钥库密钥密码。
过程
- 开发密码回调处理程序。 以下示例显示了一个回调处理程序:
package com.ibm.ws.wssecurity.example.cbh; import java.util.HashMap; import java.util.Map; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; import org.apache.ws.security.WSPasswordCallback; public class SamplePasswordCallback implements CallbackHandler { private Map<String, String> userPasswords = new HashMap<String, String>(); private Map<String, String> keyPasswords = new HashMap<String, String>(); public SamplePasswordCallback() { // some example user passwords userPasswords.put("user1", "user1pswd"); userPasswords.put("admin", "adminpswd"); // some example key passwords keyPasswords.put("alice", "keypwsd"); keyPasswords.put("bob", "keypswd"); } public void handle(Callback[] callbacks) throws IOException, UnsupportedCallbackException { for (int i = 0; i < callbacks.length; i++) { WSPasswordCallback pwcb = (WSPasswordCallback)callbacks[i]; String id = pwcb.getIdentifier(); String pass = null; switch (pwcb.getUsage()) { case WSPasswordCallback.USERNAME_TOKEN_UNKNOWN: case WSPasswordCallback.USERNAME_TOKEN: pass = userPasswords.get(id); pwcb.setPassword(pass); break; case WSPasswordCallback.SIGNATURE: case WSPasswordCallback.DECRYPT: pass = keyPasswords.get(id); pwcb.setPassword(pass); break; } } } }
- 为回调处理程序创建 MANIFEST.MF 文件。 以下示例显示了 MANIFEST.MF 文件:
Manifest-Version: 1.0 Bnd-LastModified: 1359415594428 Build-Identifier: SNAPSHOT-Mon Jan 28 17:26:34 CST 2013 Bundle-Copyright: The Program materials contained in this file are IBM copyright materials. 5724-I63, 5724-J08, 5724-H89, 5724-H88, 5655-W65 Copyright International Business Machines Corp. 1999, 2012 All Rights Reserved * Licensed Materials - Property of IBM US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp. Bundle-Description: An PasswordCallbackHandler; version=1.0.0 Bundle-ManifestVersion: 2 Bundle-Name: wssecuritycbh Bundle-SymbolicName: com.ibm.ws.wssecurity.example.cbh Bundle-Vendor: IBM Bundle-Version: 1.0.0 Created-By: 1.6.0 (IBM Corporation) Export-Package: com.ibm.ws.wssecurity.example.cbh;uses:="com.ibm.websphe re.ras.annotation,javax.security.auth.callback";version="1.0.0" Import-Package: com.ibm.websphere.ras,com.ibm.websphere.ras.annotation,c om.ibm.ws.ffdc,javax.security.auth.callback,org.apache.ws.security;version="[1.6,2)" Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version>=1.6))" Tool: Bnd-2.1.0.20120920-170235 WS-TraceGroup: WSSecurity
- 将回调处理程序打包在 JAR 文件中。 创建一个具有回调处理程序类以及在先前步骤中所创建的 MANIFEST.MF 文件的 JAR 文件。 以下示例显示了称为 SampleCbh.jar 的样本 JAR 文件的内容:
META-INF/MANIFEST.MF com/ibm/ws/wssecurity/example/cbh/SamplePasswordCallback.class
- 创建功能部件清单文件。 以下示例显示了一个称为 wsseccbh-1.0.mf 的样本功能部件清单文件:
Subsystem-ManifestVersion: 1 Subsystem-SymbolicName: wsseccbh-1.0; visibility:=public Subsystem-Version: 1.0.0 Subsystem-Content: com.ibm.ws.wssecurity.example.cbh; version="[1,1.0.100)"; location:="lib/"; type="osgi.bundle"; start-phase:=APPLICATION_EARLY Subsystem-Type: osgi.subsystem.feature IBM-Feature-Version: 2 IBM-API-Package: com.ibm.ws.wssecurity.example.cbh; version="1.0"; type="internal"
- 将回调处理程序作为 Liberty 中的用户功能部件安装。 将回调处理程序 JAR 文件和功能部件清单文件复制到 Liberty 用户目录下。 以下示例说明了在何处复制这些文件:
build.image/wlp/usr/extension/lib/SampleCbh.jar build.image/wlp/usr/extension/lib/features/wsseccbh-1.0.mf
- 将回调处理程序配置为 server.xml 文件中的用户功能部件。 将回调处理程序定义为 server.xml 文件中的用户功能部件。 以下示例说明如何将回调处理程序定义为用户功能部件:
<featureManager> <feature>usr:wsseccbh-1.0</feature> <feature>servlet-3.0</feature> <feature>appSecurity-2.0</feature> <feature>jaxws-2.2</feature> <feature>wsSecurity-1.1</feature> </featureManager>
结果
下一步做什么

文件名:twlp_wssec_callbackhandler.html