Esse artigo é um passo-a-passo da criação de um 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.
Através desse artigo, espero que você consiga tirar todas suas dúvidas sobre como deve ser desenvolvido 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.
Tópicos:
- 01 - Tabelas no MySQL
- 02 - Conexão com o banco de dados
- 03 - Criando o formulário e script de Login
- 04 - Verificando se usuário está logado no sistema
- 05 - O script de notícias
- 06 - Sistema em funcionamento
Primeiramente 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:

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:

Notícias:

Perceba as senhas criptogradas 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á apenas em 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.
02. 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");
?>
03. Criando o formulário e script de Login
Página com o formulário onde o usuário digitará o login e senha:

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
{
echo "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.
04. 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 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ê quiser deixar como restritas, simplesmente inclua o arquivo verifica.php.
Enfim! Chegamos ao principal desse artigo! O script de notícias, onde tudo o que foi criado acima será usado. 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 "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><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
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 notícias 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");
?>
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.


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).

Obs: caso a versão do seu PHP seja anterior à 4.1.0, use a variável $HTTP_SESSION_VARS no lugar da superglobal $_SESSION.
Clique aqui para fazer o download dos códigos desse artigo.
E é isso! Até o próximo!











27 Comentários
Qual a sua opinião?