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

  • Post author:
  • Post category:Sem categoria

Este artigo foi retirado do site: http://www.linhadecodigo.com.br/artigos.asp?id_ac=258

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.

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.

Tópicos:
# 1 – Tabelas no MySQL
# 2 – Conexão com o banco de dados
# 3 – Criando o formulário e script de Login
# 4 – Verificando se usuário está logado no sistema
# 5 – O script de notícias

6 – Sistema em funcionamento

1 – 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:

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 “
“;

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.

2 – 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”);
?>

3 – 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.

4 – 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”.

5 – 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 “Bem-Vindo ” . $_SESSION[“nome_usuario”] . “!
\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 ” | Postar nova notícia\n”;

}

// Imprime link de logout

echo ” | Sair do Sistema“;

echo “

\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 “

\n”;

echo “

\n”;

// Efetua o loop no banco de dados

while($dados = mysql_fetch_array($result_id))

{

echo “

“;

echo “

\n”;

}

// Fecha tabela

echo “

Id Título Data
” . $dados[“id”] . “ “;
echo ” ” . stripslashes($dados[“titulo”]) . “;
echo “
/m/Y à\s H:i:s”, $dados[“data”]) . “

\n”;

}

else

{

echo “Nenhuma notícia cadastrada!\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”); ?>

6 – 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.

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

Clique aqui para fazer o download dos códigos desse artigo.