Programación en castellano Añadir una dirección | Buscador | Cursos | Artículos | Foros | Formación

Sistema de Nombrado en Java (JNDI) y II
Autor: Sun
Traductor: Juan Antonio Palos (Ozito)


En esta página:


Retrollamadas para Mecanismos SASL

Un mecanismo SASL siempre da la identidad de autorización, bien la especificada por las propiedades de entorno "java.naming.security.sasl.authorizationId" o por Context.SECURITY_PRINCIPAL. Todas las demás entradas se suministran bajo demanda, es decir, en solicitud del mecanismo.

Por defecto, el proveedor LDAP suministra la identidad de autentificación y las credenciales usando las propiedades de entorno Context.SECURITY_PRINCIPAL y Context.SECURITY_CREDENTIALS respectivamente. Si un mecanismo SASL requiere otras entradas distintas a estas, o si preferimos suministrar la entrada de una forma diferente, podemos definir un objeto manejador de retrollamada para el mecanismo a utilizar. Para hacer esto, configuramos la propiedad de entorno "java.naming.security.sasl.callback" con el objeto manejador de retrollamada como se explica más adelante.

Callback Handler (Manejador de Retrollamada)

El proveedor LADP usa el paquete javax.security.auth.callback de Java Authentication and Authorization Service. El objeto contenido en la propiedad de entorno "java.naming.security.sasl.callback" debe ser del tipo javax.security.auth.callback.CallbackHandler. Cuando un mecanismo SASL requiere una entrada, llama a javax.security.auth.callback.CallbackHandler.handle(), y le suministra una lista de las retrollamadas que necesita para obtener esa entrada. Un mecanismo debe usar el javax.security.auth.callback.NameCallback cuando pida la identidad de autentificación y usar el javax.security.auth.callback.PasswordCallback cuando pida las credenciales. Para obtener otra entrada, el mecanismo usará una de las retrollamadas definidas en el paquete javax.security.auth.callback o cualquier otra retrollamada que implemente el interface javax.security.auth.callback.Callback. La manejador de retrollamadas debe poder manejar el tipo de retrollamada solicitada por un mecanismo, por eso la aplicación que crea/usa el manejador de retrollamadas debe tener algún conocimiento sobre los mecanismos que necesita.

Aquí tenemos un ejemplo de un manejador de retrollamada que maneja NameCallback y PasswordCallback para leer los datos desde la entrada estándar:

public class SampleCallbackHandler implements CallbackHandler {
    public void handle(Callback[] callbacks) 
	throws java.io.IOException, UnsupportedCallbackException {
	    for (int i = 0; i < callbacks.length; i++) {
		if (callbacks[i] instanceof NameCallback) {
		    NameCallback cb = (NameCallback)callbacks[i];
		    cb.setName(getInput(cb.getPrompt()));

		} else if (callbacks[i] instanceof PasswordCallback) {
		    PasswordCallback cb = (PasswordCallback)callbacks[i];

		    String pw = getInput(cb.getPrompt());
		    char[] passwd = new char[pw.length()];
		    pw.getChars(0, passwd.length, passwd, 0);

		    cb.setPassword(passwd);
		} else {
		    throw new UnsupportedCallbackException(callbacks[i]);
		}
	    }
    }

    /**
     * A reader from Standard Input. In real world apps, this would
     * typically be a TextComponent or similar widget.
     */
    private String getInput(String prompt) throws IOException {
	System.out.print(prompt);
	BufferedReader in = new BufferedReader(
	    new InputStreamReader(System.in));
	return in.readLine();
    }
}	

CRAM-MD5 usando un Manejador de Retrollamadas

Aquí hay una versión modificada del ejemplo CRAM-MD5 que obtiene su password usando un manejador de retrollamadas en lugar de la propiedad de entorno Context.SECURITY_CREDENTIALS. El mecanismo CRAM-MD5 necesita la identidad de autorización y la password como entradas. La identidad se obtiene desde la propiedad Context.SECURITY_PRINCIPAL. Todas las otras entradas que necesita el mecanismo CRAM-MD5 se suministran mediante SampleCallbackHandler.

// Set up the environment for creating the initial context
Hashtable env = new Hashtable(11);
env.put(Context.INITIAL_CONTEXT_FACTORY, 
    "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=JNDITutorial");

env.put(Context.SECURITY_AUTHENTICATION, "CRAM-MD5");

// Specify bind DN as C. User
env.put(Context.SECURITY_PRINCIPAL,
    "cn=C. User, ou=NewHires, o=JNDITutorial");

// If the authorization id differs, set using 
// java.naming.security.sasl.authorizationId property
// env.put("java.naming.security.sasl.authorizationId", "u:cuser");

// Specify the callback to use for fetching the authentication id/password
env.put("java.naming.security.sasl.callback", new SampleCallbackHandler());

// Create the initial context
DirContext ctx = new InitialDirContext(env);

// ... do something useful with ctx

Principio Página
© 1999-2002, Programación en castellano, s.l.
Contacto - Datos legales

ReD Internet: Hospedaje Web | envio sms gratis | Salvapantallas | Fondos de Escritorio, famosas | melodias moviles gratis| Gratis