En Liberty, se pueden utilizar los manejadores de devolución de llamada de contraseña
en muchos escenarios de WS-Security para recuperar las contraseñas. Por ejemplo,
se pueden recuperar las contraseñas para generar UsernameTokens, abrir
almacenes de claves o acceder a claves privadas. Es necesario un manejador de devolución de llamada de contraseña
para el proveedor cuando utiliza PasswordDigest. El manejador de devolución de llamada de contraseña
debe estar empaquetado como una característica de usuario en Liberty.
Acerca de esta tarea
En esta tarea se describe cómo desarrollar un manejador de devolución de llamada de contraseña
para recuperar el nombre de usuario y las contraseñas de clave de almacén de claves.
Procedimiento
- Desarrolle un manejador de devolución de llamada de contraseña. En el ejemplo siguiente se muestra un manejador de devolución de llamada.
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() {
// algunas contraseñas de usuario de ejemplo
userPasswords.put("user1", "user1pswd");
userPasswords.put("admin", "adminpswd");
// algunas contraseñas de clave de ejemplo
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;
}
}
}
}
- Cree un archivo MANIFEST.MF para el manejador de devolución de llamada. En el ejemplo siguiente se muestra un archivo 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
- Empaquete el manejador de devolución de llamada en un archivo JAR. Cree un archivo JAR con la clase de manejador de devolución de llamada y el archivo MANIFEST.MF que ha creado en los pasos anteriores. El ejemplo siguiente muestra el contenido de un archivo JAR de ejemplo denominado SampleCbh.jar:
META-INF/MANIFEST.MF
com/ibm/ws/wssecurity/example/cbh/SamplePasswordCallback.class
- Cree un archivo de manifiesto de característica. En el ejemplo siguiente se muestra un archivo de manifiesto
de característica de muestra denominado 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"
- Instale el manejador de devolución de llamada como una característica de usuario en Liberty. Copie el archivo JAR del manejador de devolución de llamada y el archivo de manifiesto de característica
en el directorio de usuario de Liberty. En el ejemplo siguiente se muestra dónde copiar los archivos:
build.image/wlp/usr/extension/lib/SampleCbh.jar
build.image/wlp/usr/extension/lib/features/wsseccbh-1.0.mf
- Configure el manejador de devolución de llamada como una característica de usuario en el archivo server.xml. Defina el manejador de devolución de llamada como una característica de usuario en el archivo server.xml. En el ejemplo siguiente se muestra cómo definir el manejador de devolución de llamada
como una característica de usuario:
<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>
Resultados
Ha desarrollado correctamente el manejador de devolución de llamada de contraseña
y ha instalado el manejador de devolución de llamada en
Liberty.
Qué hacer a continuación
Puede utilizar ahora este manejador de devolución de llamada para recuperar las contraseñas de
las UsernameTokens y las claves privadas que se utilizan en la configuración de WS-Security.