Logon unico com LDAP

Um detalhe em que trabalhei neste ultimo mês foi interação de sistemas Flex com LDAP, para fazer logon único em todos os sistemas. Imagina que a empresa ao qual você precisa desenvolver o sistema, possui um sistema de domínio(LDAP) onde todos os usuários já possuem login, senha e cadastro completo, e política de senhas predefinidas.

Então para que montar todo um sistema de cadastro de usuários, tendo o usuário um novo login, uma nova senha, um novo cadastro?

Então neste Post tratarei sobre a integração de sistemas com o serviço de diretório.

Antes de começar você deve entrar em contato com o responsável pelo LDAP na empresa e solicitar a estrutura da árvore da empresa (Se você não esta entendendo nada, sugiro que leia a documentação do LDAP antes). Ele passará algo como:

SERVER: intranet.mxml.com.br
PORT: 389
BASE: dc=mxml,dc=com,dc=br
USERNAME: cn=UserSistemaDoAlemao,dc=mxml,dc=com,dc=br
PASSWORD: SenhaDeAcesso
FILTER: (&(ObjectClass=person)(Atrubuto2=SuaEscolha))
ATTRIBUTE: uid

Com estes dados entra o primeiro problema, acalmar o desespero de como usar todos estes dados, e como vou faze-lo em PHP? Procurar no Google, bla, não achei nada de exemplo. Então no PHPbrasil achei algo que começou a me ajudar. Autenticando no Active Directory com PHP via LDAP.

Porém no caso da empresa em questão não estava funcionando como eu queria, Então cheguei até o LDAPSearch, Este me ajudou em muito neste inicio de carreira com o LDAP.

O código PHP que faz esta conexão esta abaixo:

<?php
// Atributos para conexão
$m_server = "intranet.mxml.com.br";
$m_port = 389;
$m_basedn = "dc=mxml,dc=com,dc=br";
$m_USER_ADM = "cn=UserSistemaDoAlemao,dc=mxml,dc=com,dc=br";
$m_USER_PW = "SenhaAdmin";
$m_USER = "alemao";
$m_PW = "SenhaAlemao";
$m_search = "(&(ObjectClass=person)(Atrubuto2=SuaEscolha))";

// Abre a conexao com o banco dee dados
$m_ds = @ldap_connect($m_server, $m_port);
// Faz logim como administrador
@ldap_bind($m_ds, $m_USER_ADM, $m_USER_PW);

$m_sucess = false;
// Faz a busca pelo usuário em toda arvore do LDAP
$m_sr = @ldap_search($m_ds, $m_basedn, sprintf($m_search, $m_USER));
// conta quantas resultados foram obtidas
$n_entradas = @ldap_count_entries($m_ds, $m_sr);
// Se possuir um ou mais usuarios, o usuario existe
if ($n_entradas > 0)
{
    // Pega os dados do usuário
    $entry = @ldap_first_entry($m_ds, $m_sr);
    $attrs = @ldap_get_attributes($m_ds, $entry);
    $m_dn = @ldap_get_dn($m_ds, $entry);

    // Faz login com os stributos do usuário
    $r = @ldap_bind($m_ds, $m_dn, $m_PW);
    // se falhar
    if (empty ($r))
    {
        // Define a senha como errada
        $m_error_msg = "Senha Invalida!";
    }
    // caso contrário
    else
    {
        // esvazia a variavel de $m_error_msg
        $m_error_msg = "";
        // Define sucesso a variavel $m_sucess
        $m_sucess = true;
    }
}
// Caso nehum dado retorne, não existe nehum usuário com este login
else
{
    $m_error_msg = "Usuario Invalido!";
}
// Fecha a conexão com o LDAP
@ ldap_close($m_ds);
if($m_sucess == true)
{
    echo "Autenticado!!";
}
else
{
    echo $m_error_msg;
}
?>

O código completo se encontra aqui.

OBS: No pacote de código que esta para download é diferente do código disponível acima. O código PHP que esta disponível para download se trata de uma classe de conexão, precisando de uma interface para o uso. Para um bom entendimento do exemplo é importante que leia os manuais do LDAP e a
documentação no PHP Brasil sobre autenticação LDAP

Fique por dentro de nossas novidades, ideias e atualizações