Por que eu devo ler este artigo: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 Autenticado de Notícias
Sistema Autenticado de Notícias

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!