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)
...