Sistema de Cadastro de Usuários e Login com Sessions

Sistema de Cadastro de Usuários e Login com Sessions
Sistema de Cadastro de Usuários e Login com Sessions

Gostaria de deixar entendido que não é minha intenção utilizar métodos complexos, programação PHP de nível intermediário/avançado, tento apenas passar o conhecimento básico para a construção de um simples sistema de cadastro e login utilizando sessions  e banco de dados MySQL e md5()  para senhas, onde também será possível atribuir diferentes níveis de acesso à páginas restritas e a possibilidade do usuário solicitar a criação de nova senha quando esta se perde ou é esquecida.

Obs.: Não aconselho a utilizar o método “Copiar/Colar” com os códigos aqui apresentados e sim digita-los, linha por linha com muita atenção, assim o aproveitamento será bem maior, porém se alguém quiser os arquivos para abrir em seu editor, os mesmos estão compactados em pasta .zip no final deste tutorial.

Trabalharemos com os seguintes arquivos:

  • bancodedados.sql
  • config.php
  • formulario_cadastro.php
  • cadastrar.php
  • ativar.php
  • formulario_login.html
  • verifica_usuario.php
  • area_restrita.php
  • functions.php
  • logout.php
  • formulario_senha_perdida.php
  • gerar_nova_senha.php

Vamos ao tutorial! Tomo por início que você já tenha um banco de dados MySQL disponível, passamos então para criação da tabela necessária para o armazenamento dos dados referente aos usuários. Eu utilizei o gerenciador SQL phpMyAdmin, digitando e executando o código abaixo no campo de consulta SQL do gerenciador.

bancodedados.sql

CREATE TABLE usuarios(
usuario_id int(5) NOT NULL auto_increment,
nome varchar(50) NOT NULL default '',
sobrenome varchar(50) NOT NULL default '',
email varchar(100) NOT NULL default '',
usuario varchar(32) NOT NULL default '',
senha varchar(32) NOT NULL default '',
info text NOT NULL,
nivel_usuario enum('0','1','2') NOT NULL default '0',
data_cadastro datetime NOT NULL default '0000-00-00 00:00:00',
data_ultimo_login datetime NOT NULL default '0000-00-00 00:00:00',
ativado enum('0','1') NOT NULL default '0',
PRIMARY KEY (usuario_id)
) ENGINE = MYISAM CHARACTER SET latin1 COLLATE latin1_general_ci COMMENT = '';

Agora criaremos o arquivo de conexão com o banco de dados. config.php

<?php

define('BD_USER', 'usuário de banco de dados');
define('BD_PASS', 'senha do banco de dados');
define('BD_NAME', 'nome do seu banco de dados');

mysql_connect('localhost', BD_USER, BD_PASS);
mysql_select_db(BD_NAME);

?>

O próximo passo é montarmos nosso formulário de cadastro que irá popular a tabela que criamos mais acima.

formulario_cadastro.php

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formulário Cadastro</title>
</head>

<body>

<form name="cadastro" method="post" action="cadastrar.php">

Nome
<input name="nome" type="text" id="nome" value="<?php echo $nome; ?>" /><br />

Sobrenome
<input name="sobrenome" type="text" id="sobrenome" value="<?php echo $sobrenome; ?>" /><br />
Email

<input name="email" type="text" id="email" value="<?php echo $email; ?>" /><br />
Nome de Usuário

<input name="usuario" type="text" id="usuario" value="<?php echo $usuario; ?>" /><br />

+ informações sobre você

<textarea name="info" id="info"><?php echo $info; ?></textarea> <br />

<input type="submit" name="Submit" value="Enviar" /> <br />

</form>

</body>
</html>

De nada adianta este formulário se não tivermos o arquivo que recebe os dados enviados, o arquivo responsável por este recebimento será o que vamos ver mais abaixo. cadastrar.php

<?php

include "config.php";

$nome = trim($_POST['nome']);
$sobrenome = trim($_POST['sobrenome']);
$email = trim($_POST['email']);
$usuario = trim($_POST['usuario']);
$info = trim($_POST['info']);

/* Vamos checar algum erro nos campos */

if ((!$nome) || (!$sobrenome) || (!$email) || (!$usuario)){

echo "ERRO: <br /><br />";

if (!$nome){

echo "Nome é requerido.<br />";

}

if (!$sobrenome){

echo "Sobrenome é requerido.<br /> <br />";

}

if (!$email){

echo "Email é um campo requerido.<br /><br />";

}

if (!$usuario){

echo "Nome de Usuário é requerido.<br /><br />";

}

echo "Preencha os campos abaixo: <br /><br />";

include "formulario_cadastro.php";

}else{

/* Vamos checar se o nome de Usuário escolhido e/ou Email já existem no banco de dados */

$sql_email_check = mysql_query(

"SELECT COUNT(usuario_id) FROM usuarios WHERE email='{$email}'"

);

$sql_usuario_check = mysql_query(

"SELECT COUNT(usuario_id) FROM usuarios WHERE usuario='{$usuario}'"

);

$eReg = mysql_fetch_array($sql_email_check);
$uReg = mysql_fetch_array($sql_usuario_check);

$email_check = $eReg[0];
$usuario_check = $uReg[0];

if (($email_check > 0) || ($usuario_check > 0)){

echo "<strong>ERRO</strong>: <br /><br />";

if ($email_check > 0){

echo "Este email já está sendo utilizado.<br /><br />";

unset($email);

}

if ($usuario_check > 0){

echo "Este nome de usuário já está sendo
utilizado.<br /><br />";

unset($usuario);

}

include "formulario_cadastro.php";

}else{

/* Se passarmos por esta verificação ilesos é hora de
finalmente cadastrar os dados. Vamos utilizar uma função para gerar a senha de
forma randômica*/

function makeRandomPassword(){

$salt = "abchefghjkmnpqrstuvwxyz0123456789";
srand((double)microtime()*1000000);
$i = 0;

while ($i <= 7){

$num = rand() % 33;
$tmp = substr($salt, $num, 1);
$pass = $pass . $tmp;
$i++;

}

return $pass;

}

$senha_randomica = makeRandomPassword();
$senha = md5($senha_randomica);

// Inserindo os dados no banco de dados

$info = htmlspecialchars($info);

$sql = mysql_query(

"INSERT INTO usuarios
(nome, sobrenome, email, usuario, senha, info, data_cadastro)

VALUES
('$nome', '$sobrenome', '$email', '$usuario', '$senha', '$info', now())")

or die( mysql_error()

);

if (!$sql){

echo "Ocorreu um erro ao criar sua conta, entre em contato.";

}else{

$usuario_id = mysql_insert_id();

// Enviar um email ao usuário para confirmação e ativar o cadastro!

$headers = "MIME-Version: 1.0\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\n";
$headers .= "From: Teu Domínio - Webmaster<email@teusite.com.br>";

$subject = "Confirmação de cadastro - teusite.com.br";
$mensagem = "Prezado {$nome} {$sobrenome},<br />
Obrigado pelo seu cadastro em nosso site, <a href='http://www.teusite.com.br'>
http://www.teusite.com.br</a>!<br /> <br />

Para confirmar seu cadastro e ativar sua conta em nosso site, podendo acessar à
áreas exclusivas, por favor clique no link abaixo ou copie e cole na barra de
endereço do seu navegador.<br /> <br />

<a href='http://www.teusite.com.br/ativar.php?id={$usuario_id}&code={$senha}'>

http://www.teusite.com.br/ativar.php?id={$usuario_id}&code={$senha}

</a>

<br /> <br />
Após a ativação de sua conta, você poderá ter acesso ao conteúdo exclusivo
efetuado o login com os seguintes dados abaixo:<br > <br />

<strong>Usuario</strong>: {$usuario}<br />
<strong>Senha</strong>: {$senha_randomica}<br /> <br />

Obrigado!<br /> <br />

Webmaster<br /> <br /> <br />
Esta é uma mensagem automática, por favor não responda!";

mail($email, $subject, $mensagem, $headers);

echo "Foi enviado para seu email - ( ".$email." ) um pedido de
confirmação de cadastro, por favor verifique e sigas as instruções!";

}

}

}

?>

Como podemos ver no arquivo acima, ao cadastrar-se, automaticamente é enviado uma mensagem de confirmação de cadastro para a conta de email que o usuário digitou no formulário de cadastro, esta mensagem conterá instruções de como proceder. Através de um link nesta mensagem ele executará um arquivo que ativa definitivamente sua conta e só a partir desta ativação que o membro poderá acessar a área restrita. ativar.php

<?php

include "config.php";

$usuario_id = $_REQUEST['id'];
$senha = $_REQUEST['code'];

$sql = mysql_query(

"UPDATE usuarios SET ativado='1'
WHERE usuario_id='{$usuario_id}'
AND senha='{$senha}'"

);

$sql_doublecheck = mysql_query(

"SELECT * FROM usuarios
WHERE usuario_id='{$usuario_id}'
AND senha='{$senha}'
AND ativado='1'"

);

$doublecheck = mysql_num_rows($sql_doublecheck);

if ($doublecheck == 0){

echo "<strong>Sua conta não pode ser ativada!</strong>";

}elseif ($doublecheck > 0){

echo "<strong>Seu cadastro foi ativado com sucesso!</strong><br />
Você pode fazer o login logo abaixo!<br /><br />";

include "formulario_login.html";

}

?>

Já estamos cadastrando usuários e ativando suas contas corretamente e sem problemas, mas para que cadastrar um usuário se pelo menos não dermos alguns privilégios para este membro? Fazemos assim então, ao efetuar o login o usuário cadastrado terá acesso à uma área restrita, mas para isso precisamos de um formulário de login simples, então vamos lá. formulario_login.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Login</title>
</head>

<body>

Login <br /><br />

<form action="verifica_usuario.php" method="post" name="" id="">

Usuário<br />
<input name="usuario" type="text" id="usuario" /><br />

Senha<br />
<input name="senha" type="password" id="senha" /><br /><br />

<input type="submit" name="Submit" value="Enviar" / >

</form>

</body>

</html>

Não adianta disponibilizar um formulário de login se não tivermos um arquivo para receber os dados enviados e efetuar uma verificação se realmente são dados de um usuário cadastrado ou alguém tentando logar sem as devidas permissões, então continuamos. verifica_usuario.php

<?php

session_start(); // Inicia a session

include "config.php";

$usuario = $_POST['usuario'];
$senha = $_POST['senha'];

if ((!$usuario) || (!$senha)){

echo "Por favor, todos campos devem ser preenchidos! <br /><br />";

include "formulario_login.html";

}else{

$senha = md5($senha);

$sql = mysql_query(

"SELECT * FROM usuarios
WHERE usuario='{$usuario}'
AND senha='{$senha}'
AND ativado='1'"

);

$login_check = mysql_num_rows($sql);

if ($login_check > 0){

while ($row = mysql_fetch_array($sql)){

foreach ($row AS $key => $val){

$$key = stripslashes( $val );

}

$_SESSION['usuario_id'] = $usuario_id;
$_SESSION['nome'] = $nome;
$_SESSION['sobrenome'] = $sobrenome;
$_SESSION['email'] = $email;
$_SESSION['nivel_usuario'] = $nivel_usuario;

mysql_query(

"UPDATE usuarios SET data_ultimo_login = now()
WHERE usuario_id ='{$usuario_id}'"

);

header("Location: area_restrita.php");

}

}else{

echo "Você não pode logar-se! Este usuário e/ou senha não são válidos!<br />
Por favor tente novamente!<br />";

include "formulario_login.html";

}

}

?>

Percebemos acima que caso o usuário não esteja cadastrado no banco de dados ou caso ele insira dados errados nos campos do formulário de login, ele não consegue entrar na área restrita, mas conseguir validar terá acesso à tão desejada área restrita. Vamos então fazer um arquivo de exemplo que representará uma página de acesso restrito. area_restrita.php

<?php

session_start(); // Inicia a session
include "functions.php"; // arquivo de funções.
session_checker(); // chama a função que verifica se a session iniciada da acesso à página.

echo "Bem vindo <strong>". $_SESSION['nome'] ." ". $_SESSION['sobrenome'] ."</strong>!<br />
Você está acessando área restrita para usuários cadastrados!
<br /><br />";

echo "Seu nível de usuário é <strong>". $_SESSION['nivel_usuario']."</strong>.
<br />Com esse nível, você tem permisão de acesso às
seguintes áreas: <br /><br />";

if ($_SESSION['nivel_usuario'] == 0){

echo "- <strong>Forum</strong><br />Abrir tópicos, postar em tópicos
de terceiros.<br /><br />";

}

if ($_SESSION['nivel_usuario'] == 1){

echo "- <strong>Forum</strong><br />Administração -
Acesso total <br /><br />";

}

/* Não colocarei representações para outros níveis de acesso, mas fica entendido que o
limite de níveis de acesso quem define é você*/

echo "<a href=\"logout.php\">Sair</a>";

?>

Neste arquivo acima eu mencionei mais dois arquivos que ainda não criamos. O primeiro arquivo conterá uma função de verificação como eu comentei no início do script acima. Vejamos ele. functions.php

<?php

function session_checker(){

if (!isset($_SESSION['usuario_id'])){

header ("Location:formulario_login.html");
exit();

}

}

?>

Ops! No arquivo exemplo que representa a área restrita, eu coloquei no final uma opção para sair desta área, sendo assim não posso faltar com minha palavra, por tanto vamos cria-la, assim sempre que o usuário sair utilizando esta opção só poderá acessar a área restrita se efetuar o login novamente. Acredito que não teremos problema algum em entender o funcionamento. logout.php

<?php

session_start();

if (!isset($_REQUEST['logmeout'])){

echo "Você realmente deseja sair da área restrita?<br />";
echo "<a href=\"logout.php?logmeout\">Sim</a> | ";
echo "<a href=\"javascript:history.go(-1)\">Não</a>";

}else{

session_destroy();

if (!session_is_registered('nome')){

echo "<strong>Você não está mais logado em nosso site!</strong>";
echo "<br /><br /><strong>Login:</strong><br /><br />";

include "formulario_login.html";

}

}

?>

hummm, já ia me esquecendo, como vamos disponibilizar uma opção para gerar nova senha, onde seria o melhor lugar para colocarmos um link para chamar o arquivo que dará início da criação de uma nova senha se não no próprio arquivo .html que utilizamos para efetuar o login. Então que tal colocarmos abaixo do formulário de login? Façamos o seguinte então, adicione essas linhas logo abaixo no arquivo formulario_login.html bem abaixo do botão Enviar:

<br /><a href="formulario_senha_perdida.html" >- Não lembra a  sua senha?</a>

Quase no final, agora resta apenas criarmos o formulário para requisição de nova senha para os casos de esquecimento ou perda que será chamado pelo link que criamos acima e também o arquivo que recebe os dados e envia a nova senha para o email cadastrado do usuário. Vamos lá então! formulario_senha_perdida.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Formulário Nova Senha</title>
</head>

<body>

<form name="form1" method="post" action="">

Por favor digite o seu email que está cadastrado em nosso banco de dados;<br />

<input name="email" type="text" id="email" />
<input name="recupera" type="hidden" id="recupera" value="recupera" />

<input type="submit" name="Submit" value="Gerar Senha" />

</form>

</body>

</html>

Para completar, o arquivo responsável em receber os dados do formulário acima, onde baseando-se em uma verificação de resultado afirmativo da existência deste email no banco de dados passa a gerar uma nova senha e envia-la para o mesmo email cadastrado, caso o email não exista, não precisa nem dizer o que acontece, sendo assim vamos ao que interessa. gerar_nova_senha.php

<?php

include "config.php";

$recupera = $_POST['recupera'];
$email = $_POST['email'];

switch ($recupera){

case "recupera" :

recupera_senha($email);
break;

default :

include "formulario_senha_perdida.html";
break;

}

function recupera_senha($email){

if (!isset($email)){

echo "Você esqueceu de preencher seu email.<br />
<strong>Use o mesmo email que utilizou em seu cadastro.</strong><br /><br />";

include "formulario_senha_perdida.html";

exit();

} // Checando se o email informado está cadastrado

$sql_check = mysql_query("SELECT * FROM usuarios WHERE email='{$email}'");
$sql_check_num = mysql_num_rows($sql_check);

if ($sql_check_num == 0){

echo "Este email não está cadastrado em nosso banco de dados.<br /><br />";

include "formulario_senha_perdida.html";

exit();

}

// Se tudo OK vamos gerar uma nova senha e enviar para o email do usuário!

function makeRandomPassword(){

$salt = "abchefghjkmnpqrstuvwxyz0123456789";
srand((double)microtime()*1000000);
$i = 0;

while ($i <= 7){

$num = rand() % 33;
$tmp = substr($salt, $num, 1);
$pass = $pass . $tmp;
$i++;

}

return $pass;

}

$senha_randomica = makeRandomPassword();
$senha = md5($senha_randomica);
$sql = mysql_query(

"UPDATE usuarios SET senha='{$senha}'
WHERE email ='{$email}'"

);

$headers = "MIME-Version: 1.0\n";
$headers .= "Content-type: text/html; charset=iso-8859-1\n";
$headers .= "From: Teu Domínio - Webmaster<email@teusite.com.br>";

$subject = "Sua nova senha em teusite.com.br";

$message = "Olá, redefinimos sua senha.<br /><br />
<strong>Nova Senha</strong>: {$senha_randomica}<br /><br />

<a href='http://www.teusite.com/formulario_login.html'>

http://www.teusite.com/formulario_login.html

</a><br /><br />
Obrigado!<br /><br />
Webmaster<br /><br /><br />

Esta é uma mensagem automática, por favor não responda!";

mail($email, $subject, $message, $headers);

echo "Sua nova senha foi gerada com sucesso e enviada para o seu email!<br />
Por favor verifique seu email!<br /><br />";

include "formulario_login.html";

}

?>

Observação: Obviamente este tutorial é apresentado da forma simples e crua, onde a intenção é ajudar os iniciantes em PHP, porém há formas mais requintadas de tratar os dados aqui trabalhados e não gostaria de colocar em questão isso, pois como disse o objetivo é apresentar uma forma simples para quem ainda tenha pouco contato com PHP e gostaria de entrar nesse mundo.

Baixar os arquivos desse tutorial

Fonte: Sistema Básico