sexta-feira, 29 de novembro de 2013

Autenticação JAVA com Ldap Windows




package jdbc;

/**
 *
 * @author ltgarcia
 */
import java.util.Hashtable;

import javax.naming.AuthenticationException;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.InitialDirContext;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;

public class LdapAuthentication {
    /*Classe que realiza a conexao e autenticacao ao LDAP*/

    /*
     * Singleton
     */
    protected static LdapAuthentication instanceLdap;
    /*
     * Implementacao do Initial context para LDAP
     */
    public static String INITIAL_CTX = "com.sun.jndi.ldap.LdapCtxFactory";
    /*
     * Servidor LDAP
     */
    public static String SERVIDOR = "ldap://192.168.1.8:389";

    /*
     * Tipo de conexao realizada
     */
    public static String CONNECTION_TYPE = "simple";

    /*
     * Nome distinto do admin
     */
    public static String ADMIN_DN = "cn=ltgarcia, cn=users, dc=unialco, dc=local";

    /*
     * Senha
     */
    public static String ADMIN_PW = "senha";

    /*
     * Diretorio Base
     */
    public static String BASE_DN = "DC=unialco, dc=local";

    /*
     * Mensagem de Erro de Conexao ao Ldap
     */
    public static String MSG_ERROR_LDAP_CONNECTION = "Nao foi possi­vel obter um contexto LDAP";

    /*
     * Mensagem de Erro sobre Validacao do Login e Password
     */
    public static String MSG_ERROR_LDAP_VALIDATION_USER = "Username ou Password Invalida";

    private LdapAuthentication() {
        super();
    }

    /**
     * Obtem a mesma instancia de LdapAuthentication para todas as chamadas
     *
     * @return um objeto LdapAuthentication
     */
    public static LdapAuthentication getInstance() {
        if (instanceLdap == null) {
            instanceLdap = new LdapAuthentication();
        }
        return instanceLdap;
    }

    /**
     * Metodo responsavel por realizar a chamada para autenticacao via ldap do
     * login e password passados como parametros.
     *
     */
    public boolean authentication(String login, String password) {
        DirContext ctx = null;
        SearchControls sc = null;
        String filtro = null;
        NamingEnumeration cursor = null;
        boolean bResult = false;
        /*
         * Cria conexao padrao com LDAP
         */
        ctx = createLdapConnection();
        if (ctx != null) {
            sc = new SearchControls();
            sc.setSearchScope(SearchControls.SUBTREE_SCOPE);
            /*
             * Define atributos de retorno da consulta
             */
            String[] atributosParaRetornar = { "distinguishedName" };
            sc.setReturningAttributes(atributosParaRetornar);
            /*
             * Especifica login para consulta
             */
            filtro = "(&(sAMAccountName=" + login + "))";
            try {
                cursor = ctx.search(BASE_DN, filtro, sc);
                if (cursor.hasMoreElements()) {
                    SearchResult result = (SearchResult) cursor.nextElement();
                    Attributes att = result.getAttributes();
                    String dn = (String) att.get("distinguishedName").get();
                    /*
                     * Se o login existe, tenta autenticar no LDAP com a senha
                     * fornecida pelo usuario
                     */
                    bResult = validateUser(dn, password);
                }
            } catch (NamingException e) {
                System.out.println(MSG_ERROR_LDAP_CONNECTION);
                e.printStackTrace();
            }
        }
        return bResult;
    }

    /**
     * Metodo responsavel por realizar a conexao padrao com o Ldap.
     *
     */
    private DirContext createLdapConnection() {
        DirContext ctx = null;
        Hashtable env = new Hashtable();
        // Especifica INITIAL CONTEXT
        env.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CTX);
        // Especifica o IP/Nome e a porta do servidor LDAP
        env.put(Context.PROVIDER_URL, SERVIDOR);
        // Usuário ADMIN
        env.put(Context.SECURITY_PRINCIPAL, ADMIN_DN);
        // Senha ADMIN
        env.put(Context.SECURITY_CREDENTIALS, ADMIN_PW);
        // Tipo de Conexão
        env.put(Context.SECURITY_AUTHENTICATION, CONNECTION_TYPE);
        try {
            // Cria um Initial Context
            ctx = new InitialDirContext(env);
        } catch (NamingException e) {
            System.out.println(MSG_ERROR_LDAP_CONNECTION);
            e.printStackTrace();
        }
        return ctx;
    }

    /**
     * Metodo responsavel por realizar a validacao do login no Ldap. O campo dn
     * é distinguished name formado anteriormente a partir da consulta do login
     * no Ldap.
     *
     */
    private boolean validateUser(String dn, String senha) {
        DirContext ldapCtx = null;
        boolean bResult = false;
        Hashtable env = new Hashtable();
        // Especifica INITIAL CONTEXT
        env.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CTX);
        // Especifica o IP/Nome e a porta do servidor LDAP
        env.put(Context.PROVIDER_URL, SERVIDOR);
        // Ldap Distingued Name
        env.put(Context.SECURITY_PRINCIPAL, dn);
        // Senha Usuário
        env.put(Context.SECURITY_CREDENTIALS, senha);
        // Tipo de Conexão
        env.put(Context.SECURITY_AUTHENTICATION, CONNECTION_TYPE);
        try {
            // Cria um Initial Context
            ldapCtx = new InitialDirContext(env);
        } catch (AuthenticationException auEx) {
            System.out.println(MSG_ERROR_LDAP_VALIDATION_USER);
            auEx.printStackTrace();
        } catch (NamingException ne) {
            System.out.println(MSG_ERROR_LDAP_CONNECTION);
            ne.printStackTrace();
        } finally {

            if (ldapCtx != null) {
                bResult = true;
            }
        }
        return bResult;
    }
}

Nenhum comentário:

Postar um comentário