Autenticação no diretório LDAP

Estou desenvolvendo uma aplicação e preciso autenticar o login dos usuários no diretório LDAP, andando pela net encontri o seguinte código para isso:

package loginldap;

import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;

public class LoginLDAP {

private LdapContext ctx;
private final String URL_LDAP = "ldap://192.168.0.1:389";

/**
* Efetua o login do usuário
* Se login inválido, lança uma exceção do tipo AuthenticationException
*/
public boolean login(String dn, String password) throws NamingException {
Hashtable env = new Hashtable(11);

env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, URL_LDAP);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, dn);
env.put(Context.SECURITY_CREDENTIALS, password);

// Tenta criar o contexto com os dados de login
try {
ctx = new InitialLdapContext(env,null);
return true;

} catch (javax.naming.AuthenticationException e) {
// Login inválido
return false;
}

}

public static void main(String[] args) {
LoginLDAP l = new LoginLDAP();
try {
if (l.login("cn=Antonio Henriques,ou=Desenvolvimento,o=Portal Java,dc=com,dc=br","1234")) {
System.out.println("Login válido");
} else {
System.out.println("Login inválido");
}

} catch (NamingException n) {
n.printStackTrace();
}
}
}

mas quando eu executo dá o seguinte erro:

root cause

java.lang.NullPointerException
	java.util.Hashtable.put(Hashtable.java:396)
	relatorio2.LoginLDAP.login(LoginLDAP.java:54)
	relatorio2.LoginLDAP.Autentica(LoginLDAP.java:72)
        ...

eu já troquei informações como o número do servidor e tal mas alguém sabe me explicar por que dá esse erro?
:?:

Tente isso…

Factory

	public static DirContext init() throws NamingException {
		  Hashtable env = new Hashtable();
		  env.put( "java.naming.factory.initial", "com.sun.jndi.ldap.LdapCtxFactory" );
		  env.put( "java.naming.provider.url", "ldap://localhost:" + "10389" + "/dc=example,dc=com" );
		  env.put( "java.naming.security.principal", "uid=admin,ou=system" );
		  env.put( "java.naming.security.credentials", "secret" );
		  env.put( "java.naming.security.authentication", "simple" );
		  DirContext ctx = new InitialDirContext( env );
		  return ctx;
	}

Busca de qualquer atributo no LDAP

	public void buscaUsuario(DirContext ctx) throws NamingException {
		SearchControls sc = new SearchControls();
		sc.setSearchScope(SearchControls.SUBTREE_SCOPE);
		String[] atributosParaRetornar = {"cn", "telephoneNumber"};
		sc.setReturningAttributes(atributosParaRetornar);
		String filtro = "(&(objectClass=groupOfNames)(telephoneNumber=*23*))";
		NamingEnumeration cursor = ctx.search("ou=Usuario",filtro,sc);
		while (cursor.hasMoreElements()) {
			SearchResult result = (SearchResult)cursor.nextElement();
			Attributes att = result.getAttributes();
			String valorCN = (String) att.get("cn").get();
			System.out.println(valorCN);
		}
	}

DirContext ctx = new InitialDirContext( env ); return ctx;

Esse ctx retorna o quê?? Porque eu vou usar em um if,else…

[quote=sstr]
Esse ctx retorna o quê?? [/quote]

Retorna uma interface do serviço de diretórios, para fazer leitura e escrita no LDAP.

O correto é voce fazer uma busca pelo “uid” no usuário do cara e verificar se acha ou não, ou apenas tentar logar com o usuário dele no AD