Autenticação em base LDAP

2 respostas
S

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

2 Respostas

S

Olá Pessoal,

Fiz um novo teste com outro exemplo e funcionou. Segue código.

package br.mar.visualiza.ldap;

/**
 *
 * @author Josenias
 */
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 {

    /**
     * @param args the command line arguments
     */
    private LdapContext ctx;
    private final String URL_LDAP = "ldap://javmail.mar.com.br: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
            e.printStackTrace();
            return false;
        }

    }

    public static void main(String[] args) {
        // TODO code application logic here

        loginLDAP l = new loginLDAP();
        try {
            if (l.login("uid=fulano,ou=Users,dc=javmail", "fulano")) {
                System.out.println("Login válido");
            } else {
                System.out.println("Login inválido");
            }

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

Alguém sabe porque não funcionou no exemplo anterior?

Grato

Josenias

S

Olá Pessoal,
Não estou tento muito sucesso com ajuda, mas já descobrir porque o sistema não retorna nenhum usuário.

// 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);

Quando passo o parâmetro:

matchAttrs.put(new BasicAttribute("userPassword", senha));

E na busca passo o matchAttrs coma senha “fulano” não funciona, quando comento o userPassword o sistema retorna o usuário fulano.

Alguém sabe como passar o usuário e a senha no matchAttrs e que funcione no ctx.search?

Grato

Josenias

Criado 19 de agosto de 2010
Ultima resposta 20 de ago. de 2010
Respostas 2
Participantes 1