Olá Pessoal,
Tenho uma aplicação para desktop e gostaria de autenticar em uma servidor LDAP.
Segui o mesmo procedimento escrito nesse link:
http://www.furutani.com.br/2008/09/autenticacao-e-obtencao-de-dados-via-ldap/ por Roberto Furutani.
Fiz a implementação e o sistema não apresentou nenhum erro ao testar.
O meu problema é que o sistema não retorna nenhum registro quando faz o acesso na base LDAP.
Nesse treco do código e sai, pois não encontrou nada
// Exibindo o resultado, se houver
while (resultado.hasMore())
Meu usuário existe a senha está correta e não vai.
Estou colocando as classes que fiz pra vê se alguém tem uma luz.
Classe LDAPParametrosConfig ? Possuí constantes de configuração.
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.mar.visualiza.ldap;
/**
*
* @author Josenias
*/
public class LDAPParametrosConfig {
/*
* Implementação do Initial context para LDAP
*/
public static final String INITIAL_CTX = "com.sun.jndi.ldap.LdapCtxFactory";
/*
* Servidor LDAP
*/
public static final String SERVIDOR = "ldap://javmail.mar.com.br:389";
/*
* Base de busca
*/
public static final String SEARCHBASE = "ou=users,dc=javmail";
/*
* Nome do usuário do admin
*/
public static final String ADMIN_DN = "cn=admin, dc=javmail";
/*
* Senha
*/
public static final String ADMIN_PW = "hoM0+IoQDN-KYX4/";
/*
* ?top level? do diretório (base DN)
*/
public static final String BASE_DN = "dc=javmail";
}
Classe LDAPServiceLocator ? Localiza o servidor LDAP
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.mar.visualiza.ldap;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
/**
*
* @author Josenias
*/
public class LDAPServiceLocator {
protected static LDAPServiceLocator instance;
private LDAPServiceLocator() {
super();
}
/**
* Obtem a mesma instancia de LDAPServiceLocator para todas as chamadas
* (Classe singleton)
*
* @return um objeto LDAPServiceLocator
*/
public static LDAPServiceLocator getInstance() {
if (instance == null) {
instance = new LDAPServiceLocator();
}
return instance;
}
public DirContext getContext() {
Hashtable env = new Hashtable(2);
// Especifica a fabrica de INITIAL CONTEXT
env.put(Context.INITIAL_CONTEXT_FACTORY,
LDAPParametrosConfig.INITIAL_CTX);
// Especifica o IP/Nome e a porta do servidor LDAP
env.put(Context.PROVIDER_URL, LDAPParametrosConfig.SERVIDOR);
System.out.println(Context.PROVIDER_URL.toString()+","+ LDAPParametrosConfig.SERVIDOR.toString());
// As linhas abaixo são usadas quando o servidor LDAP não permite busca como anonymous
//env.put(Context.SECURITY_PRINCIPAL, LDAPParametrosConfig.ADMIN_DN );
//env.put(Context.SECURITY_CREDENTIALS, LDAPParametrosConfig.ADMIN_PW );
DirContext ctx = null;
try {
// Obtem um Initial Context
ctx = new InitialDirContext(env);
} catch (NamingException e) {
System.out.println("Não foi possivel obter um contexto LDAP");
e.printStackTrace();
}
System.out.println(ctx);
return ctx;
}
}
Classe TesteLDAP ? Essa classe verifica se o usuário e a senha estão corretos, se estiverem exibe os dados retornados
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package br.mar.visualiza.ldap;
import javax.naming.NamingEnumeration;
import javax.naming.directory.Attribute;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.SearchResult;
/**
*
* @author Josenias
*/
public class testeLDAP {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// ////////////////////
// Inicialmente há apenas esse usuario
String login = "fulano";
String senha = "fulano";
// ///////////
DirContext ctx = LDAPServiceLocator.getInstance().getContext();
Attributes matchAttrs = new BasicAttributes(false);
// Array de atributos que deseja retornar do LDAP
String[] atributosRetorno = new String[]{"mail", "cn", "userPassword"};
// Parametros de busca
matchAttrs.put(new BasicAttribute("uid", login));
matchAttrs.put(new BasicAttribute("userPassword", senha));
System.out.println("Buscando...");
try {
// Efetua a busca
NamingEnumeration resultado = ctx.search(
LDAPParametrosConfig.SEARCHBASE, matchAttrs,
atributosRetorno);
// Exibindo o resultado, se houver
while (resultado.hasMore()) {
SearchResult sr = (SearchResult) resultado.next();
// Obtem os atributos
Attributes atributos = sr.getAttributes();
for (NamingEnumeration todosAtributos = atributos.getAll(); todosAtributos.hasMore();) {
Attribute attrib = (Attribute) todosAtributos.next();
String nomeAtributo = attrib.getID();
System.out.println("Atributo:" + nomeAtributo);
// Exibe todos os valores do atributo
for (NamingEnumeration e = attrib.getAll(); e.hasMore();) {
System.out.println("\tvalor:" + e.next());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Busca finalizada.");
}
}
Segue imagem da minha base LDAP.
Obrigado,
Josenias
