Você está na página 1de 7

iMasters - Por uma Internet mais criativa e dinmica

Pgina 1 de 7

Alfred Reinold Baudisch Segunda-feira, 16 de agosto de 2004

Autenticao de usurios em PHP usando sesses e MySQL


Esse artigo um passo-a-passo da criao de um sistema de autenticao de usurios usando banco de dados MySQL e, principalmente, as poderosas sesses do PHP. Mostro tambm como trabalhar com senhas em MD5 e permisses para os usurios. Atravs desse artigo, espero que voc consiga tirar todas suas dvidas sobre como deve ser desenvolvido um sistema de autenticao. Esse artigo mostra a principal base, o qual voc poder facilmente adaptar s suas necessidades. As senhas sero criptografadas em hash MD5, aumentando o nvel de segurana. Vou usar como exemplo um sistema de notcias, onde as notcias sero visveis apenas para usurios registrados. Usurios registrados tambm podero enviar novas notcias. Tpicos: 01 - Tabelas no MySQL 02 - Conexo com o banco de dados 03 - Criando o formulrio e script de Login 04 - Verificando se usurio est logado no sistema 05 - O script de notcias 06 - Sistema em funcionamento 01. Tabelas no MySQL Primeiramente vamos criar as tabelas no MySQL do nosso sistema de notcias. As tabelas se chamaro aut_noticias e aut_usuarios, referentes s Notcias e Usurios respectivamente. Cdigo SQL das tabelas:

http://imasters.uol.com.br/artigo/2450/mysql/autenticacao_de_usuarios_em_php_usand... 18/3/2008

iMasters - Por uma Internet mais criativa e dinmica

Pgina 2 de 7

O campo postar da tabela aut_usuarios registra a permisso do usurio, se ele poder postar (valor S) ou no (valor N) novas notcias. Agora, vamos inserir alguns dados na tabela, para que o exemplo do artigo funcione. Aqui irei dar tudo pronto, mas no seu caso, em seu sistema, voc dever criar uma seo para adicionar usurios, notcias, etc... Mas isso fica fora do escopo desse artigo. Usurios:

Notcias:

Perceba as senhas criptogradas em MD5. Para isso, use a funo md5("senha_aqui") e ento salve o valor gerado no banco de dados, no caso, as senhas so senha123 e teste respectivamente. Eu usei o cdigo abaixo para saber o MD5 para salvar no banco de dados: <?php echo md5("senha123"); echo "<br>"; echo md5("teste"); ?> Veja tambm que a hora na tabela de notcias est apenas em um valor numrico. Para isso, usei a funo time() do PHP. Para voc saber qual essa data e hora, use a funo date(). Isso ser mostrado adiante. 02. Conexo com o banco de dados

http://imasters.uol.com.br/artigo/2450/mysql/autenticacao_de_usuarios_em_php_usand... 18/3/2008

iMasters - Por uma Internet mais criativa e dinmica

Pgina 3 de 7

Vamos agora criar o arquivo comum.php onde existir a conexo de banco de dados, usado em todas as pginas. <?php // Conecta-se com o MySQL mysql_connect("localhost", "root", "root"); // Seleciona banco de dados mysql_select_db("noticias"); ?> 03. Criando o formulrio e script de Login Pgina com o formulrio onde o usurio digitar o login e senha:

Agora vamos criar a pgina login_vai.php, o qual recebe os dados do formulrio login.html e efetua o login do usurio. <?php // Conexo com o banco de dados require "comum.php"; // Inicia sesses session_start(); // Recupera o login $login = isset($_POST["login"]) ? addslashes(trim($_POST["login"])) : FALSE; // Recupera a senha, a criptografando em MD5 $senha = isset($_POST["senha"]) ? md5(trim($_POST["senha"])) : FALSE; // Usurio no forneceu a senha ou o login if(!$login || !$senha) { echo "Voc deve digitar sua senha e login!"; exit; } /** * Executa a consulta no banco de dados. * Caso o nmero de linhas retornadas seja 1 o login vlido, * caso 0, invlido. */ $SQL = "SELECT id, nome, login, senha, postar FROM aut_usuarios WHERE login = "". $login . """;

http://imasters.uol.com.br/artigo/2450/mysql/autenticacao_de_usuarios_em_php_usand... 18/3/2008

iMasters - Por uma Internet mais criativa e dinmica

Pgina 4 de 7

$result_id = @mysql_query($SQL) or die("Erro no banco de dados!"); $total = @mysql_num_rows($result_id); // Caso o usurio tenha digitado um login vlido o nmero de linhas ser 1.. if($total) { // Obtm os dados do usurio, para poder verificar a senha e passar os demais dados para a sesso $dados = @mysql_fetch_array($result_id); // Agora verifica a senha if(!strcmp($senha, $dados["senha"])) { // TUDO OK! Agora, passa os dados para a sesso e redireciona o usurio $_SESSION["id_usuario"] = $dados["id"]; $_SESSION["nome_usuario"] = stripslashes($dados["nome"]); $_SESSION["permissao"] = $dados["postar"]; header("Location: index.php"); exit; } // Senha invlida else { echo "Senha invlida!"; exit; }

} // Login invlido else { echo "O login fornecido por voc inexistente!"; exit; } ?>

Veja o uso da funo strcmp na comparao das senhas. Ela est comparando as duas senhas j criptografadas em hash MD5. Lembrando que a funo strcmp retorna ZERO caso 2 strings sejam iguais, por isso o uso do operador NOT (!) na frente da mesma. 04. Verificando se usurio est logado no sistema Agora, o script verifica.php que verifica a sesso do usurio se ele est logado ou no. Caso no esteja logado, o redireciona para a pgina de login. <?php // Inicia sesses session_start(); // Verifica se existe os dados da sesso de login if(!isset($_SESSION["id_usuario"]) || !isset($_SESSION["nome_usuario"])) { // Usurio no logado! Redireciona para a pgina de login header("Location: login.html"); exit; }

http://imasters.uol.com.br/artigo/2450/mysql/autenticacao_de_usuarios_em_php_usand... 18/3/2008

iMasters - Por uma Internet mais criativa e dinmica

Pgina 5 de 7

?> Em todo script que voc usar sesses, obrigatrio que voc inicie as mesmas, chamando a funo session_start() no comeo dos scripts. Para as pginas que voc quiser deixar como restritas, simplesmente inclua o arquivo verifica.php. 05. O script de notcias Enfim! Chegamos ao principal desse artigo! O script de notcias, onde tudo o que foi criado acima ser usado. Esse arquivo o index.php. <?php // Verificador de sesso require "verifica.php"; // Conexo com o banco de dados require "comum.php"; // Imprime mensagem de boas vindas echo "Bem-Vindo" . $_SESSION["nome_usuario"] . "!<BR>\n"; // Verifica e imprime quantidade de notcias no nome do usurio $SQL = "SELECT id FROM aut_noticias WHERE autor_id = " . $_SESSION["id_usuario"]; $result_id = mysql_query($SQL) or die(mysql_error()); $total = mysql_num_rows($result_id); if($total) { echo "H um total de " . $total . " notcia(s) de sua autoria!\n"; } else { echo "No h nenhuma notcia de sua autoria!\n"; } /** * Verifica se usurio tem permisso para postar novas notcias. * Caso positivo, imprime link para postagem de notcias */ if($_SESSION["permissao"] == "S") { echo " | <a href="nova.php">Postar nova notcia</a>\n"; } // Imprime link de logout echo " | <a href="sair.php">Sair do Sistema</a>"; echo "<br><br>\n"; /** * Imprime as notcias

http://imasters.uol.com.br/artigo/2450/mysql/autenticacao_de_usuarios_em_php_usand... 18/3/2008

iMasters - Por uma Internet mais criativa e dinmica

Pgina 6 de 7

*/ $SQL = "SELECT id, titulo, data FROM aut_noticias ORDER BY data DESC"; $result_id = mysql_query($SQL) or die(mysql_error()); $total = mysql_num_rows($result_id); if($total) { // Abre tabela HTML echo "<table border=1 cellpadding=3 cellspacing=0>\n"; echo "<tr><th>Id</th><th>Ttulo</th><th>Data</th></tr>\n"; // Efetua o loop no banco de dados while($dados = mysql_fetch_array($result_id)) { echo "<tr><td>" . $dados["id"] . "</td><td><a href="ver_noticia.php?id=" . $dados["id"] . "\">" . stripslashes($dados["titulo"]) . "</a></td>"; echo "<td>" . date("d/m/Y \s H:i:s", $dados["data"]) . "</td></tr>\n"; } // Fecha tabela echo "</table>\n"; } else { echo "<B>Nenhuma notcia cadastrada!</B>\n"; } ?> O script de notcias verifica se usurio tem permisso para postar novas notcias. Caso sim, imprime o link para a postagem. O arquivo para postar notcias no ser explicado aqui, pois fica fora do escopo desse artigo, mas, um exemplo de como deve ser feito: <?php // Verificador de sesso require "verifica.php"; // Verifica se usurio tem permisso para postar notcia if($_SESSION["permissao"] !== "S") { echo "Voc no tem permisso para postar notcias!"; exit; } // Se o script continuar aqui, que o usurio tem permisso // Ento.. seu formulrio de postagem abaixo ?> sempre recomendvel que voc coloque um link para que o usurio encerre a sesso de login atual (sesses so encerradas com a funo session_destroy()), caso ele no queira mais permanecer na pgina. No nosso exemplo, a pgina a sair.php: <?php

http://imasters.uol.com.br/artigo/2450/mysql/autenticacao_de_usuarios_em_php_usand... 18/3/2008

iMasters - Por uma Internet mais criativa e dinmica

Pgina 7 de 7

// Inicia sesses, para assim poder destru-las session_start(); session_destroy(); header("Location: login.html"); ?> 06. Sistema em funcionamento Agora hora de testar tudo! Primeiro, logue-se com o login "einstein" e senha "senha123". Esse usurio tem permisso para postar novas notcias e tem 2 notcias postadas.

Clique em "Sair do Sistema" e logue-se com o login "admin" e senha "teste". O usurio no tem permisso para escrita e tem apenas uma notcia postada (por exemplo, como ele no tem permisso para escrita, ento deve ter sido um administrador postado a notcia com o nome desse usurio).

Obs: caso a verso do seu PHP seja anterior 4.1.0, use a varivel $HTTP_SESSION_VARS no lugar da superglobal $_SESSION. Clique aqui para fazer o download dos cdigos desse artigo. E isso! At o prximo!

http://imasters.uol.com.br/artigo/2450/mysql/autenticacao_de_usuarios_em_php_usand... 18/3/2008

Você também pode gostar