Autenticação de usuário em Servidores Windows via função ldap do PHP
junho 11th, 2008Este post é direcionado ao desenvolvedores em php que desejam implementar acesso direto aos servidores Windows via Active Directory (AD).
Utilizaremos a função do php inerentes ao protocolo LDAP, então: vamos entender melhor.
O que é o LDAP?
O Lightweight Directory Access Protocol (LDAP) é um protocolo para acesso e modificação de informações de diretórios através da rede.
O LDAP permite que você localize pessoas, organizações, e outros recursos tais como arquivos e dispositivos na rede, seja na Internet ou numa Intranet.
Para entendermos melhor podemos tomar como comparação os programas de banco de dados. O MySQL, MSSQL Server e Oracle dentre tantos outros são SGBDs com características e definições próprias,
mas para qualquer um a linguagem universal de comunicação e acesso a dados é o SQL. O LDAP nada mais é, do que a linguagem de comunicação entre qualquer aplicação com o Active Directory (AD).
Mais informações sobre o LDAP:
- LDAP Zone http://www.ldapzone.com/
- ldapman.org http://www.ldapman.org/ (apresenta alguns bons artigos introdutórios).
- The LDAP Schema Repository http://ldap.akbkhome.com/ (esse é indispensável).
Isto depende muito do cenário tecnológico no qual que você se encontra:
- O primeiro requisito mínimo indispensável para que você possa desfrutar desta tecnologia, é ter acesso a um ambiente que conte com algum servidor da plataforma WINDOWS que ofereça o recurso do AD (Active Directory).
- O segundo requisito é você entender a estrutura do AD de seu domínio. Se a empresa no qual trabalho tem uma árvore de AD muito vasta e complexa, contando com muitos usuáios subdivididos em vários domínios e em suas respectivas Ous (Organizations Units). Se você não entende muito bem essa linguagem, recomendo que pesquise informações sobre como funciona o AD antes de prosseguir, abaixo seguem link de sites que podem ajudar no processo de aprendizado sobre o AD:
- http://www.microsoft.com/brasil/technet/centralwindows/centromigracao/activedirectory/gerenciando.mspx
- http://support.microsoft.com/default.aspx?scid=kb;en-us;325284
Agora que já conhece o PHP, LDAP e o AD, você tem respaldo suficiente para analisar (tomando como base o contexto no qual sua empresa ou cliente esta inserido) para avaliar se esta é a melhor solução a se adequar ao seu caso.
Lembre-se cada caso é um caso, e por isso devemos analisar cuidadosamente todos os casos antes de definir qual o melhor método de autenticação para nossa(s) aplicação(ções).
Agora podemos começar as configurações do php e, se necessário: o servidor também, com adição com cópias de dll’s.
Servidor:
Precisa verificar se há três dll na pasta system32, caso não localize-as e faça uma cópia dessas para a pasta em questão: system32.
libsasl.dll
libeay32.dll
ssleay32.dll
Depois disso reinicie o servidor.
PHP:
Para poder habilitar o suporte ao LDAP em um ambiente com Apache/PHP é necessário seguir os seguintes passos:
- Abrir o arquivo php.ini e descomentar a linha:
;extension=php_ldap.dll
- Em seguida restartar o serviço do Apache
Testando a conexão:
Acessando o AD com PHP
Primeiro para acessar um servidor AD devemos indicar ao PHP qual o servidor queremos conectar e criar uma conexão, para isso usamos a função:
ldap_connect(”servidor”);
O uso desta função é bem simples, abaixo segue um exemplo:
<?php
if (!($conexao = @ldap_connect(”127.0.0.1″))) {
die(”Não foi possével se conectar com o servidor de AD”);
} else {
echo “Conectado com sucesso !!!”;
}
?>
No exemplo acima $connect é a variável que irá receber o ponteiro da conexão caso o PHP consiga estabelecer uma conexão com o AD. Como pode ter observado “127.0.0.1″ é o IP do servidor, mas também poderíamos se comunicar com o servidor AD pelo nome sem problemas.
<?php
if (!($conexao = @ldap_connect(”localhost”))) {
die(”Não foi possével se conectar com o servidor de AD”);
} else {
echo “Conectado com sucesso !!!”;
}
?>
OBS: Não se esqueça que o parâmetro de connect(); tem de ser uma string.
Agora que já conectamos ao servidor é necessário efetuarmos a autenticação com o mesmo, para isso o php tem a função:
ldap_bind($connect, $user, $password);
Exemplo:
<?php
if (!($conexao = @ldap_connect(”localhost”))) {
die(”Não foi possível se conectar com o servidor de AD”);
} else {
echo “Conectado com sucesso !!!<br>”;
}
if (!($bind = @ldap_bind($conexao, $usuario, $senha))) {
//se não validar
echo “Usuário ou senha incorretos !!!”;
} else {
//se validar
echo “Usuário autenticado !!!”;
}
?>
Após ter conectado com o servidor o ponteiro para esta conexão é armazenado na variável $connect que é passado para a função ldap_bind();
Os outros dois parâmetros desta função são um usuário e uma senha válidos no AD. Uma observação importante é que usuário na verdade é composta da seguinte forma: “DOMINIO\USUARIO”
Caso o domínio da minha empresa seja “´portalwepe.com” e eu queira autenticar o usuário “evaldo” o script ficaria da seguinte forma:
<?php
if (!($conexao = @ldap_connect(”localhost”))) {
die(”Não foi possível se conectar com o servidor de AD”);
} else {
echo “Conectado com sucesso !!!<br>”;
}
if (!($bind = @ldap_bind($conexao, “portalwebpe.com\evaldo”, $senha))) {
//se não validar
echo “Usuário ou senha incorretos !!!”;
} else {
//se validar
echo “Usuário autenticado !!!”;
}
?>