Sistema de autenticação de usuários em PHP usando sessões e MySQL

Esse artigo é um passo-a-passo da criação de um simples sistema de autenticação de usuários usando banco de dados MySQL e principalmente, as poderosas sessões do PHP. Mostro também como trabalhar com senhas em MD5 e permissões para os usuários.

Fique por dentro
Através desse artigo, espero que você consiga tirar todas suas dúvidas sobre como deve ser um sistema de autenticação. Esse artigo mostra a principal base, o qual você poderá facilmente adaptar às suas necessidades.

As senhas serão criptografadas em hash MD5, aumentando o nível de segurança.

Vou usar como exemplo um sistema de notícias, onde as notícias serão visíveis apenas para usuários registrados. Usuários registrados também poderão enviar novas notícias.

Tabelas no MySQL

Primeiro vamos criar as tabelas no MySQL do nosso sistema de notícias. As tabelas se chamarão aut_noticias e aut_usuarios, referentes às Notícias e Usuários respectivamente.

Código SQL das tabelas:

CREATE TABLE 'aut_noticias' ( 'id' int(11) NOT NULL auto_increment, 'titulo' varchar(255) NOT NULL defalut '', 'conteudo' text NOT NULL, 'autor_id" int (11) NOT NULL default '0', 'data' int (11) NOT NULL default '0', PRIMARY KEY ('id') ) TYPE=My ISAM AUTO_INCREMENT=4;
CREATE TABLE 'aut_usuarios' ( 'id' int(11) NOT NULL auto_increment, 'nome' varchar(255) NOT NULL, 'login' varchar(255) NOT NULL, 'senha' varchar(255) NOT NULL, 'postar' varchar(255) NOT NULL, PRIMARY KEY ('id') ) TYPE=My ISAM AUTO_INCREMENT=4;

O campo "postar" da tabela aut_usuarios registra a permissão do usuário se ele poderá postar (valor S) ou não (valor N) novas notícias.

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 seção para adicionar usuários, notícias, etc. Mas, isso fica fora do escopo desse artigo.

Usuários: INSERT INTO 'aut_usuarios' VALUES (1, 'Albert Einstein', 'einstein', 'e7d80ffeefa212b7c5c55700e4f7193e', 'S'); INSERT INTO 'aut_usuarios' VALUES (2, 'Usuário Teste', 'admin', '698dc19d489c4e4db73e28a713eab07b', 'N'); Notícias: INSERT INTO 'aut_noticias' VALUES (1, 'Sisitema de Usuários', 'bla bla bla \r\n\r\nbla bla bla', 1, 1079449401); INSERT INTO 'aut_noticias' VALUES (2, 'Atentado em Madri', 'onono onono onono onono', 1, 1079449430); INSERT INTO 'aut_noticias' VALUES (3, 'Kernel 2.6', 'oioioi oioioi oioioi oioioi', 2, 1079449456);

Perceba as senhas criptografadas em MD5, para isso, use a função md5("senha_aqui") e então salve o valor gerado no banco de dados, no caso, as senhas são senha123 e teste respectivamente. Eu usei o código abaixo para saber o MD5 para salvar no banco de dados:

<?php echo md5("senha123"); echo "<br>"; echo md5("teste"); ?>
Veja também que a hora na tabela de notícias está em apenas um valor numérico. Para isso, usei a função time() do PHP. Para você saber qual é essa data e hora, use a função date(). Isso será mostrado adiante.

Conexão com o banco de dados

Vamos agora criar o arquivo comum.php onde existirá a conexão de banco de dados, usado em todas as páginas.

<?php // Conecta-se com o MySQL mysql_connect("localhost", "root", "root"); // Seleciona banco de dados mysql_select_db("noticias"); ?>

Criando o formulário e script de Login

Página com o formulário onde o usuário digitará o login e senha:

<HTML> <HEAD><TITLE>Sistema de Notícias : Login</TITLE></HEAD> <BODY> <form action="login_vai.php" method="post"> Sistema Autenticação de Notícias.<BR> Login: <input type="text" name="login"><br> Senha: <input type="password" name="senha"><br> <input type="submit" value="OK!"> </form> </BODY></HTML>

Agora, vamos criar a página login_vai.php, o qual recebe os dados do formulário login.html e efetua o login do usuário.

<?php // Conexão com o banco de dados require "comum.php"; // Inicia sessões 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; // Usuário não 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 número de linhas retornadas seja 1 o login é válido, * caso 0, inválido. */ $SQL = "SELECT id, nome, login, senha, postar FROM aut_usuarios WHERE login = "" . $login . """; $result_id = @mysql_query($SQL) or die("Erro no banco de dados!"); $total = @mysql_num_rows($result_id); // Caso o usuário tenha digitado um login válido o número de linhas será 1.. if($total) { // Obtém os dados do usuário, para poder verificar a senha e passar os demais dados para a sessão $dados = @mysql_fetch_array($result_id); // Agora verifica a senha if(!strcmp($senha, $dados["senha"])) { // TUDO OK! Agora, passa os dados para a sessão e redireciona o usuário $_SESSION["id_usuario"]= $dados["id"]; $_SESSION["nome_usuario"] = stripslashes($dados["nome"]); $_SESSION["permissao"]= $dados["postar"]; header("Location: index.php"); exit; } // Senha inválida else { "Senha inválida!"; exit; } } // Login inválido else { echo "O login fornecido por você é inexistente!"; exit; } ?>

Veja o uso da função strcmp na comparação das senhas. Ela está comparando as duas senhas já criptografadas em hash MD5. Lembrando que a função strcmp retorna ZERO caso 2 strings sejam iguais, por isso o uso do operador NOT (!) na frente da mesma.

Verificando se usuário está logado no sistema

Agora, o script verifica.php que verifica a sessão do usuário se ele está logado ou não. Caso não esteja logado, o redireciona para a página de login.

<?php // Inicia sessões session_start(); // Verifica se existe os dados da sessão de login if(!isset($_SESSION["id_usuario"]) || !isset($_SESSION["nome_usuario"])) { // Usuário não logado! Redireciona para a página de login header("Location: login.html"); exit; } ?>

Em todo script em que você usar sessões, é obrigatório que você inicie as mesmas, chamando a função session_start() no começo dos scripts.

Para as páginas que você quer deixar como restritas, simplesmente inclua o arquivo verifica.php.

O script de notícias

Enfim! Chegamos ao principal desse artigo! O script de notícias, onde tudo o que foi criado acima será usado aqui. Esse arquivo é o index.php.

<?php // Verificador de sessão require "verifica.php"; // Conexão com o banco de dados require "comum.php"; // Imprime mensagem de boas vindas echo "<font face=\"Verdana\" size=2>Bem-Vindo " . $_SESSION["nome_usuario"] . "!<BR>\n"; // Verifica e imprime quantidade de notícias no nome do usuário $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 . " notícia(s) de sua autoria!\n"; } else { echo "Não há nenhuma notícia de sua autoria!\n"; } /** * Verifica se usuário tem permissão para postar novas notícias. * Caso positivo, imprime link para postagem de notícias */ if($_SESSION["permissao"] == "S") { echo " | <a href=\"nova.php\">Postar nova notícia</a>\n"; } // Imprime link de logout echo " | <a href=\"sair.php\">Sair do Sistema</a>"; echo "<br><br>\n"; /** * Imprime as notícias */ $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>Título</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>"; echo " <a href=\"ver_noticia.php?id=" . $dados["id"] . "\">" . stripslashes($dados["titulo"]) . "; echo "</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 notícia cadastrada!</B>\n"; } ?>

O script de notícias verifica se usuário tem permissão para postar novas notícias, caso sim, imprime o link para a postagem. O arquivo para postar novas não será explicado aqui, pois fica fora do escopo desse artigo, mas, um exemplo de como deve ser feito:

<?php // Verificador de sessão require "verifica.php"; // Verifica se usuário tem permissão para postar notícia if($_SESSION["permissao"] !== "S") { echo "Você não tem permissão para postar notícias!"; exit; } // Se o script continuar aqui, é que o usuário tem permissão // Então.. seu formulário de postagem abaixo ?>

É sempre recomendável que você coloque um link para que o usuário encerre a sessão de login atual (sessões são encerradas com a função session_destroy()), caso ele não queira mais permanecer na página. No nosso exemplo, a página é a sair.php:

<?php // Inicia sessões, para assim poder destruí-las session_start(); session_destroy(); header("Location: login.html"); ?>

Sistema em funcionamento

Agora é hora de testar tudo! Primeiro, logue-se com o login "einstein" e senha "senha123". Esse usuário tem permissão para postar novas notícias e tem 2 notícias postadas.

Sistema de autenticação de usuários em PHP usando sessões e MySQL

Agora, clique em "Sair do Sistema" e logue-se com o login "admin" e senha "teste". O usuário não tem permissão para escrita e tem apenas uma notícia postada (por exemplo, como ele não tem permissão para escrita, então deve ter sido um administrador postado a notícia com o nome desse usuário).


Saiu na DevMedia!

  • Quais os três passos básicos para autenticação?: Tornar algumas páginas acessíveis apenas a um grupo de usuários autenticados é uma tarefa trivial em aplicações web. Quer saber qual a lógica por trás de cada uma dessas etapas? Assista nesse DevCast!

  • Curso de Laravel Authentication: Neste curso veremos como implementar uma autenticação do zero utilizando o Laravel. Para isso, partiremos de uma aplicação pronta que possuirá páginas públicas e protegidas, além da tabela de usuários criada em nosso banco de dados MySQL.

Saiba mais sobre PHP ;)

  • Guias de Estudo PHP: Encontre aqui todos os Guias de estudo que você precisa para dominar a linguagem PHP, desde o recurso mais básico até o mais avançado. Escolha o seu!

  • Programador PHP: Descubra o melhor caminho para aprender PHP, sem perder tempo. Acompanhe os cursos e conteúdos indicados nesse Guia na ordem em que são propostos e prepare-se para decolar sua carreira de programador PHP!

Artigos relacionados