Você pensaria que simplesmente autenticar um usuário no Active Directory seria um processo bastante simples usando LDAP em PHP sem a necessidade de uma biblioteca. Mas há muitas coisas que podem complicar muito rápido:
- Você deve validar a entrada. Um nome de usuário / senha vazios passaria de outra forma.
- Você deve garantir que o nome de usuário / senha esteja codificado corretamente ao vincular.
- Você deve criptografar a conexão usando TLS.
- Usando servidores LDAP separados para redundância no caso de um ficar inativo.
- Recebendo uma mensagem de erro informativa se a autenticação falhar.
Na verdade, é mais fácil na maioria dos casos usar uma biblioteca LDAP que suporte o acima. No final das contas acabei lançando minha própria biblioteca que lida com todos os pontos acima: LdapTools (Bem, não apenas para autenticação, ela pode fazer muito mais). Ele pode ser usado da seguinte forma:
use LdapTools\Configuration;
use LdapTools\DomainConfiguration;
use LdapTools\LdapManager;
$domain = (new DomainConfiguration('example.com'))
->setUsername('username') # A separate AD service account used by your app
->setPassword('password')
->setServers(['dc1', 'dc2', 'dc3'])
->setUseTls(true);
$config = new Configuration($domain);
$ldap = new LdapManager($config);
if (!$ldap->authenticate($username, $password, $message)) {
echo "Error: $message";
} else {
// Do something...
}
A chamada de autenticação acima irá:
- Confirme se o nome de usuário e a senha não estão vazios.
- Certifique-se de que o nome de usuário / senha estejam codificados corretamente (UTF-8 por padrão)
- Tente um servidor LDAP alternativo, caso um esteja inativo.
- Criptografe a solicitação de autenticação usando TLS.
- Forneça informações adicionais se houver falha (ou seja, conta bloqueada / desativada, etc)
Existem outras bibliotecas para fazer isso também (como Adldap2). No entanto, me senti compelido o suficiente para fornecer algumas informações adicionais, já que a resposta mais votada é, na verdade, um risco de segurança no qual confiar sem validação de entrada feita e sem usar TLS.