fazendo autenticação via PHP + LDAP

Fazendo um sistema de autenticação com PHP + LDAP.

primeiramente cria um formulário no qual você vai passar os dados de usuário e senha:

login.html

<form id="form" action="autenticacao.php" method="post">
Usuário: <input id="usuario" name="usuario" size="30" type="text" />
Senha: <input id="senha" name="senha" size="30" type="password" />
<input name="Submit" type="submit" value="    Entrar    " />
</form>

agora vamos fazer nossa autenticação com o sistema LDAP.

autenticacao.php

<?php
session_start();

/**
* 
* Criado por Édson Kuzniewski (contato Θ edsonk.com.br)  
* 18-12-2008  
*
**/

// FAZENDO A AUTENTICAÇÃO
if(!isLogin($_POST['usuario'], $_POST['senha'])){
  die("Usu&aacute;rio ou senha incorreto... Informe os mesmos dados de acesso da rede LDAP.  <a href=\"javascript:history.go(-1)\">voltar</agt;");
}else{
  echo "Usuário autenticado com sucesso!";
}

// função para fazer a autenticação com o LDAP.
function isLogin($usuario,$senha){
  global $sessao;

  /* DEFINE A VARIAVEL $PERSON COMO USUÁRIO */
  $person = $usuario;

  /* DEFINE O NOME OU IP DO SERVIDOR LDAP */
  $servidor="ldap";

  /* DEFINE A PORTA DE ACESSO AO SERVIDOR LDAP */
  $porta = "389";

  /* FAZ CONEXÃO COM O SERVIDOR LDAP */
  $ds = ldap_connect($servidor, $porta);

  /* DEFINE O DN DO SERVIDOR LDAP */
  $dn = "ou=Users, dc=edsonk, dc=com";

  /* DEFINE O FILTRO PARA PEGAR OS DADOS DO USUÁRIO */
  $filter="(|(sn=$person*)(givenname=$person*)(uid=$person))";

  /* EXECUTA O FILTRO NO SERVIDOR LDAP */
  $sr=ldap_search($ds, $dn, $filter);

  /* PEGA AS INFORMAÇÕES QUE O FILTRO RETORNOU */
  $info = ldap_get_entries($ds, $sr);

  /* PEGANDO SOMENTE O VALOR DO DN DO USUÁRIO DO LDAP PARA FAZER A AUTENTICAÇÃO */
  $cnC = $info[0]["dn"];

  /* FECHA CONEXÃO COM O LDAP */
  ldap_close($ds);

  /* EXECUTA COMANDO INTERNAMENTE NO SERVIDOR PARA FAZER A AUTENTICAÇÃO COM A SENHA */
  $comando = "ldapsearch -x -w ".$senha." -D '".$cnC."' uid='".$person."' uidNumber";

  /* PEGA O RESULTADO DO COMANDO E JOGA PARA A VARIAVEL $OUTPUT */
  $rs = exec($comando, $output);

  /* FAZ A VERIFICAÇÃO PELO RESULTADO, SE NÃO RETORNAR BRANCO É QUE O USUÁRIO FOI AUTENTICADO COM SUCESSO! */
  if($rs != ""){
     //echo"Logado com sucesso!";

     /* PEGANDO O UIDNUMBER DO USUÁRIO, QUE CONSTA NO LDAP, SERIA COMO UM CODIGO UNICO */
     $tmp = explode(" ", $output[10]);

     /* PEGANDO O UIDNUMBER E JOGANDO NA SESSÃO DO USUÁRIO */
     $_SESSION[$sessao]["user"]["uid"] = $tmp[1];

     /* DEFINE A FLAG PARA VERDADEIRA */
     $retorna = true;

  }else{
     //echo "Usuário ou senha incorretos!";
     $retorna = false;
  }

  if($_SESSION[$sessao]["user"]["usuario"] != ""){
     $retorna = true;
  }
  return $retorna;
}
?>

10 thoughts on “fazendo autenticação via PHP + LDAP

  1. Olá!
    Quero adaptar este sistema de login LDAP num site, tenho andado a ler algumas coisas sobre o assunto, mas tenho uma questão que julgo que saibas responder. Para utilizar esta forma de autenticação LDAP é necessário instalar algum coisa?

    Cumprimentos,
    Bruno José

  2. bem, primeiramente, verifique se o extension LDAP do php está ativo, para poder utilizar as funções do LDAP no php, e claro se seu LDAP tem a busca ou pesquisa de dados liberado sem a autenticação, pois no primeiro momento eu faço a verificação dos dados resultantes da pesquisa pelo UID, usuário, para poder pegar o CN completo do usuário, para que no próximo passo faço uma busca utilizando o CN completo e a senha do usuário que consta no LDAP, não sei se isto responte tua pergunta, mas qualquer coisa estamos ai!

    falow!

  3. Bom dia Édson,

    Testei o script aqui e nao conseguir ter resultado gostaria de uma ajuda sua, nunca fiz esse tipo de autenticação, ele mostra o seguinte erro:

    Warning: ldap_search(): Search: Operations error in c:\arquivos de programas\easyphp1-8\www\ldap\autenticacao.php on line 44

    Warning: ldap_get_entries(): supplied argument is not a valid ldap result resource in c:\arquivos de programas\easyphp1-8\www\ldap\autenticacao.php on line 47

    Notice: Undefined index: in c:\arquivos de programas\easyphp1-8\www\ldap\autenticacao.php on line 79
    Usuário ou senha incorreto… Informe os mesmos dados de acesso da rede LDAP. voltar

    Gostaria de saber quais informações colocar em
    $dn = “ou=Users, dc=edsonk, dc=com”;
    e o q significa cada uma delas.

    Se possível manda a resposta para meu email por favor.

    [email protected]

    Obrigado

  4. Bem como posso te dizer, o DN do LDAP pode-se dizer que é o banco de dados do LDAP onde se encontra os dados de usuário, grupos e etc do LDAP, e este DN é o mesmo que foi informado no arquivo de configuração de seu LDAP, como você pode ter uma idéia neste artigo do site linux.org: http://br-linux.org/tutoriais/002995.html

    neste arquivo “/usr/local/etc/openldap/lapd.conf” você tem as configurações procure pela linha onde indica o seguinte:
    BASE dc=edsonk,dc=com,dc=br como exemplo…

    sendo assim DN é o campo onde tem o nome do usuário na base do LDAP;
    ou= seria um grupo especifico de onde você quer pesquisar no LDAP,
    e o dc= seria o local da base podemos dizer;

    então tu pode simplesmente tirar o “ou=Users” que tem no DN e deixar somente o DC para localizar o ususário.

    se precisar de mais informações do LDAP no próprio Google você acha muitos tutorias e artigo de como configurar ele,
    então resumindo a responta pelo meu ponto de vista é o DN não esta correto, e não esta conseguindo se comunicar com o LDAP corretamente.
    caso tenha mais alguma dúvida é so reportar….

    valeu!

  5. Onde eu configuro o LDAP do Windows Server 2008 para que a pesquisa de dados seja liberada sem a autenticação ?

  6. Bom dia Édson.

    Este script funcionou muito bem, so tenho uma pequena duvida, e possivel fazer o php retornar do ldap todos os usuarios cadastrados??

  7. Opa Bruno, tem sim, se não me engano é só tu tirar o filtro da busca… neste link te mostra a função com é usada: http://www.php.net/manual/pt_BR/function.ldap-search.php, e tem outros sites de referência no qual tu pode ver a função executada diretamente no linux: http://linux.die.net/man/1/ldapsearch e também nesse outro site: http://www.istf.com.br/vb/archive/index.php/t-13873.html, espero que isso te ajude… falow!

  8. Olá pessoal,
    testei este código e depois que digito o usuário e senha, a tela seguinte aparece em branco, o IP, dn, porta, esta tudo certo mas não autentica. será que o problema esta no ldap? se alguém pudér ajudar eu agradeço…

  9. Bom dia, estou tentando usar seu código mais ele apresenta um erra na variavel global.

    18 // função para fazer a autenticação com o LDAP.
    19 function isLogin($usuario,$senha){
    20   global $sessao;
    21
    22 /* DEFINE A VARIAVEL $PERSON COMO USUÁRIO */
    23  $person = $usuario;

Deixe um comentário

O seu endereço de e-mail não será publicado.