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á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;
}
?>
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é
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!
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
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!
Onde eu configuro o LDAP do Windows Server 2008 para que a pesquisa de dados seja liberada sem a autenticação ?
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??
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!
opa, Antonio Edirane, não vou poder te ajudar, pois servidores windows não sei de nada quase… hehehe é só cheguei a usar e mecher com o LDAP no linux… falow!
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…
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;