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");
?>
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!