sexta-feira, 28 de janeiro de 2011

Tela de Login em PHP autenticando no Active Directory (AD)

Introdução:
As vezes necessitamos disponibilizar determinada informação, como um Wiki por exemplo, para ser acessada de qualquer local que estivermos, mas não queremos que essa informação seja acessada por qualquer pessoa.
Muitas vezes temos informações que necessitam de privacidade e para isso utilizamos telas de login, mas se já existe na rede uma estrutura de LDAP, que é o AD, para que ficar criando banco de dados para autenticar usuários?

Pré-Requisitos:
Você precisa ter o módulo ldap do php instalado e habilitado no seu servidor.

Entendo a estrutura dos arquivos:
index.php - Página de Login
verif.php - Página de validação das informações digitadas, realiza a conexão com o AD, retorna ao index.php ou segue para a página do seu aplicativo.
funcs.js - Função responsável por não permitir usuário e/ou senha em branco
pagina_que_voce_quer_chamar.php: Essa página é o index da aplicação que você quer proteger, como a página inicial do Wiki por exemplo, será necessário acrescentar um pequeno trecho de código nela, pois se o usuário chamar a página diretamente sem se autenticar, vai ser automáticamente redirecionado para a página de login.

Código das Páginas:
Index.php
<?php


    session_start('sessao');

?>
<html>
<head>
<script language="JavaScript" type="text/javascript" src="funcs.js"></script>
</head>
<body>

    <form method="post" action="verif.php" name="form" AUTOCOMPLETE='ON' onSubmit="return valida()">
        usuario:<br>
        <input type="text" name="usu" size="50" maxlength="50" >
        <br>
        Senha:<br>
        <input type="password" name="senha" size="50" maxlength="9" >
        <br><br>
        <input type="submit" value="Entrar">
    </form>

</body>
</html>

Verif.php
<?php

set_time_limit(0);

function valida_ldap($srv, $usr, $pwd)
{

    $ldap_server = $srv;
    $auth_user = $usr;
    $auth_pass = $pwd;

    // Tenta se conectar com o servidor
    if (!($connect = @ldap_connect($ldap_server))){
       return FALSE;
    }

    // Tenta autenticar no servidor
    if (!($bind = @ldap_bind($connect, $auth_user, $auth_pass))) {
        // se nao validar retorna false
        return FALSE;
    } else {
        // se validar retorna true
        return TRUE;
    }

} // fim funcao conectar ldap

$dominio = "@seudominio.com.br";
$usu = $_REQUEST['usu'].$dominio;
$senha = $_REQUEST['senha'];
$ip_server = "XXX.XXX.XXX.XXX";

if (valida_ldap($ip_server, $usu, $senha)) {
    echo "usuario autenticado<br>";

    session_start();
    $_SESSION['usu'] = $usu;

    header("Location: pagina_que_voce_quer_chamar.php");

}else {
    echo "Usuario ou Senha Invalidos";
    echo "<br><input type='button' value='voltar' onclick='location.href=\"index.php\";'>";
}

?>

funcs.js
function valida() {

    if (form['usu'].value == "") {
        alert("O campo USUARIO e obrigatorio");
        form['usu'].focus();
        return false
    }

    if (form['senha'].value == "") {
        alert("O campo SENHA e obrigatorio");
        form['senha'].focus();
        return false
    }
}

Código da página
<?php

session_start();

        // se usuario nao registrado, redireciona p/ validacao

        if(!isset($_SESSION['usu']))

                header("Location: index.php?op=err");
Continuação do código da aplicação

Agradecimentos:
Ludgero Scocia - Meu Personal PHP Developer Tabajara, sempre que preciso de algo em PHP acabo apelando para o Lud, que sempre me socorre!!!
Valew Brother!!!!

Referências:
Autenticando no Active Directory com PHP via LDAP
Como autenticar no Active Directory usando PHP?

19 comentários:

  1. Gustavo,

    Você checou a parte de pré-requisitos???

    Pré-Requisitos:
    Você precisa ter o módulo ldap do php instalado e habilitado no seu servidor.

    Estou com esse cara em produção...

    Abraços,

    ResponderExcluir
  2. Boa noite,
    Amigo, teste e funcionou perfeitamente.
    Me tire uma dúvida: Não seria interessante criar uma página para logout? ou você acha desnecessário?

    Desde já prabens pelo post!

    ResponderExcluir
  3. Bom Dia Jurandir,

    Depende do uso que você vai fazer, no meu caso é uma tela inicial que vai redirecionar para outros sistemas internos, ao fechar essa janela após usar o sistema ele automáticamente vai pedir o login de novo.

    Abraços,

    ResponderExcluir
  4. Parabéns pelo post!
    Testei e funcionou perfeitamente.

    Só tenho algumas dúvidas (apesar da longa data do post).

    Como por no site uma área de status mostrando o login pessoa logada e com a opção de deslogar e alterar a senha?

    Valeu.

    ResponderExcluir
  5. Bom-dia! Funcionou, porém ao clicar em um link do menu do site, ele pede a senha novamente e retorna para a principal....

    ResponderExcluir
  6. Andre, nao consigo recuperar os dados de alguem logado

    ResponderExcluir
  7. Andre nao consigo restar os dados de user logado!

    ResponderExcluir
  8. Olá! Onde está o final do código?
    Obrigada.

    ResponderExcluir
  9. Ariane,

    Depois daquilo entra o código da sua aplicação, é apenas um exemplo simples de como utilizar a autenticação.

    Abraços,

    ResponderExcluir
  10. Ok!
    Com OpenLDAP funciona, mas e se do outro lado estiver rodando Samba4 ?

    ResponderExcluir
  11. Opa, excelente! Muito bom mesmo! Caso queira recuperar os dados no AD do usuário logado, como procedo?
    Gostaria de 'manipular' os dados como e-mail, nome, telefone, etc...

    ResponderExcluir
  12. $connect = @ldap_connect($seuservidorAD, $AD_PORT); // Tenta se conectar ao servidor.


    ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);// Seta versão do protocolo ldap.


    $lRet = @ldap_bind($connect, $ADusuario, $senha); // Tenta vincular o usuário.


    /* A partir daqui é só pesquisar na árvore os dados que você deseja */

    ResponderExcluir
  13. Eu consigo através dessa autenticação , puxar os dados dos Grupos que cada usuário que logou no AD possui ?

    ResponderExcluir
  14. Fala Alisson,

    Que massa saber que ainda funciona depois de tantos anos!

    Abs,

    ResponderExcluir
  15. Bom dia, minha aplicação não terá tela de login.
    Quero que o php pegue automaticamente o usuário e senha logado no pc.
    Você sabe como fazer isso?

    ResponderExcluir