Sistema de Nombrado en Java (JNDI) y II

En LDAP, la informaci�n de autentificaci�n se suministra en la operaci�n "bind". En LDAP v2, un cliente inicia una conexi�n con el servidor lDAP enviando una operaci�n "bind" que contiene la informaci�n de autentificaci�n.

En LDAP v3, esta operaci�n sirve para el mismo prop�sito, pero es opcional. Un cliente que env� una petici�n LDAP sin hacer "bind" es tratado como un cliente an�nimo (puedes ver m�s detalles en la p�gina Autentificaci�n An�nima). en LDAP v3, la operaci�n "bind" podr�a enviarse en cualquier momento, posiblemente m�s de una vez, durante la conexi�n. Un cliente puede enviar peticiones "bind" en el medio de una conexi�n para cambiar su identidad. Si la petici�n tiene �xito, entonces todas las peticiones que est�n en espara y que usan la vieja indentidad de la conexi�n ser�n descartadas y la conexi�nes asociada con una nueva identidad.

La informaci�n de autentificaci�n suministrada en la operaci�n "bind" depende del mecanismo de autentificaci�n que el cliente elija. Puedes ver una explicaci�n sobre el mecanismo de autentificaci�n en la p�gina siguiente.

.�Autentificiaci�n en LDAP usando JNDI

En JNDI, la informaci�n de autentificaci�n se especifica en propiedades de entorno. Cuando creamos un contexto inicial usando la clase InitialDirContext (o su superclase o subclase), suministramos un conjunto de propiedades de entorno, algunas de las cuales podr�an contener informaci�n de autentificaci�n. Podemos usar las siguientes propiedades de entono para especificar informaci�n de autentificaci�n:

  • Context.SECURITY_AUTHENTICATION ("java.naming.security.authentication").

    Especifica el mecanismo de autentificaci�n a usar. Para el proveedor de servicios LDAP de Sun, esto puede ser una de las siguientes strings: "none", "simple", sasl_mech, donde sasl_mech es una lista separada por espacio de nombres de mecanismos SASL. Puedes ver una descripci�nde estos strings en la p�gina siguiente.

  • Context.SECURITY_PRINCIPAL ("java.naming.security.principal").

    Especifica el nombre del usuario/programa que est� haciendo la autentificaci�n y depende del valor de la propiedad Context.SECURITY_AUTHENTICATION.

  • Context.SECURITY_CREDENTIALS ("java.naming.security.credentials").

    Especifica las credenciales del usuario/programa que est� haciendo la autentificaci�n y depende del valor de la propiedad Context.SECURITY_AUTHENTICATION.

Cuando se crea el contexto incial, el proveedor de sevicios LDAP subyacente extrae la informaci�n de autentificaci�n de estas propiedades de entorno y usa la operaci�n "bind" de LDAP para pas�rselos al servidor.

El siguiente ejemplo muestra c�mo, usando una password de texto simple, un cliente se autentifica en un servidor LDAP:

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

// Authenticate as S. User and password "mysecret"
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "cn=S. User, ou=NewHires, o=JNDITutorial");
env.put(Context.SECURITY_CREDENTIALS, "mysecret");

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

// ... do something useful with ctx

.�Usar Informaci�n de Autentificaci�n Diferente para una Contexto

Si quermos usar informaci�n de autentificaci�n diferente para un contexto existente, podemos usar Context.addToEnvironment() y Context.removeFromEnvironment() para actualizar las propiedades de entorno que contienen la informaci�n de autentificaci�n. Las siguientes llamadas a los m�todos del contexto uar�n la nueva informaci�n de autentificaci�n para comunicarse con el servidor.

El siguiente ejemplo muestra c�mo se modifica la informaci�n de autentifiaci�n de un contexto a "none" despu�s de haber crado el contexto:

// Authenticate as S. User and the password "mysecret"
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "cn=S. User, ou=NewHires, o=JNDITutorial");
env.put(Context.SECURITY_CREDENTIALS, "mysecret");

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

// ... do something useful with ctx

// Change to using no authentication
ctx.addToEnvironment(Context.SECURITY_AUTHENTICATION, "none");

// ... do something useful with ctx

.�Fallos de Autentificaci�n

La autentificaci�n puede fallar por varias razones. Por ejemplo, si suministramos informaci�n de autentificaci�n incorrecta, como una password incorrecta, etc, entonces se lanza una AuthenticationException.

Aqu� hay un ejemplo que es una variaci�n del ejemplo anterior. Esta vez, una password incorrecta hace que falle la autentificaci�n:

// Authenticate as S. User and give an incorrect password
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "cn=S. User, ou=NewHires, o=JNDITutorial");
env.put(Context.SECURITY_CREDENTIALS, "notmysecret");

Esto produce la siguiente salida:

javax.naming.AuthenticationException: [LDAP: Invalid Credentials]
        at java.lang.Throwable.<init>(Compiled Code)
        at java.lang.Exception.<init>(Compiled Code)
	...

Como diferentes servidores soportan diferentes mecanismos de autentificaci�n, podr�amos solicitar un mecanismo de autentificaci�n que el servidor no soporta. En este caso, se lanzar� una AuthenticationNotSupportedException.

Aqu� hay un ejemplo que es una variaci�n del ejemplo anterior. Esta vez, un mecanismo de autentificaci�n no soportado ("custom") hace que falle la autentificaci�n:

// Authenticate as S. User and the password "mysecret"
env.put(Context.SECURITY_AUTHENTICATION, "custom");
env.put(Context.SECURITY_PRINCIPAL, "cn=S. User, ou=NewHires, o=JNDITutorial");
env.put(Context.SECURITY_CREDENTIALS, "mysecret");

Esto produce la siguiente salida:

javax.naming.AuthenticationNotSupportedException: Unsupported value 
for java.naming.security.authentication property.
        at java.lang.Throwable.<init>(Compiled Code)
        at java.lang.Exception.<init>(Compiled Code)
        at javax.naming.NamingException.<init>(Compiled Code)
	...

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR