Você está na página 1de 12

Hoje vou ensinar a criar um sistema de login simples usando PHP e MySQL.

É recomendável que você já tenha um conhecimento prévio de HTML e, se possível,


PHP e MySQL para tornar as coisas mais fáceis.

Nosso sistema será bem simples: um arquivo chamado seguranca.php, que deverá ser
incluído no topo do seu site (em todas as páginas) e que faz a conexão com o banco de
dados e que possui algumas funções usadas para redirecionar o visitante para o
formulário de login (login.php) caso ele não esteja logado.

Vamos ao trabalho:

O que iremos definir primeiro é a tabela usada para armazenar os usuários do sistema:

1 DROP TABLE IF EXISTS `usuarios`;


2 CREATE TABLE IF NOT EXISTS `usuarios` (
3 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
4 `nome` varchar(100) NOT NULL,
5 `usuario` varchar(50) NOT NULL,
6 `senha` varchar(50) NOT NULL,

7 PRIMARY KEY (`id`),


8 UNIQUE KEY `usuario` (`usuario`)
9 ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Execute esse bloco SQL no seu banco de dados para criar a tabela usada pelo sistema.

Depois disso, vamos ao formulário de login que você colocará dentro de um arquivo
chamado login.php:

1 <form method="post" action="valida.php">


2 <label>Usuário</label>
3 <input type="text" name="usuario" maxlength="50" />
4  
5 <label>Senha</label>
6 <input type="password" name="senha" maxlength="50" />
7  
8 <input type="submit" value="Entrar" />
9 </form>

Esse formulário, com apenas dois campos, manda pra página valida.php, que é um
pequeno PHP que receberá os dados enviados pelo formulário, fará a validação deles e
mandará o visitante ou pra página interna (index.php) ou de volta pra página de login
(login.php).
Esse é o codigo fonte do arquivo valida.php:

01 // Inclui o arquivo com o sistema de segurança


02 include("seguranca.php");

03  
04 // Verifica se um formulário foi enviado
05 if ($_SERVER['REQUEST_METHOD'] == 'POST') {
06 // Salva duas variáveis com o que foi digitado no formulário
// Detalhe: faz uma verificação com isset() pra saber se o campo foi
07
preenchido
08 $usuario = (isset($_POST['usuario'])) ? $_POST['usuario'] : '';
09 $senha = (isset($_POST['senha'])) ? $_POST['senha'] : '';
10  
// Utiliza uma função criada no seguranca.php pra validar os dados
11
digitados
12 if (validaUsuario($usuario, $senha) == true) {
// O usuário e a senha digitados foram validados, manda pra página
13
interna
14 header("Location: index.php");

15 } else {
// O usuário e/ou a senha são inválidos, manda de volta pro form de
16
login
// Para alterar o endereço da página de login, verifique o arquivo
17
seguranca.php
18 expulsaVisitante();
19 }
20 }

A estrutura do seu site, até esse ponto, deve estar dessa forma:

../pasta_do_seu_site/index.php » Página intera a ser protegida


../pasta_do_seu_site/login.php » Página com o formulário de login
../pasta_do_seu_site/valida.php » Página que faz a validação dos dados do formulário

Agora vamos criar o arquivo seguranca.php na mesma pasta dos demais arquivos:

001 /**
002 * Sistema de segurança com acesso restrito
003 *
004 * Usado para restringir o acesso de certas páginas do seu site
005 *
006 * @author Thiago Belem <contato@thiagobelem.net>
007 * @link http://thiagobelem.net/
008 *

009 * @version 1.0


010 * @package SistemaSeguranca
011 */
012  
013 //  Configurações do Script
014 // ==============================
$_SG['conectaServidor'] = true;    // Abre uma conexão com o
015
servidor MySQL?
$_SG['abreSessao'] = true;         // Inicia a sessão com um
016
session_start()?
017  
$_SG['caseSensitive'] = false;     // Usar case-sensitive? Onde
018
'thiago' é diferente de 'THIAGO'
019  
$_SG['validaSempre'] = true;       // Deseja validar o usuário e a
020
senha a cada carregamento de página?
// Evita que, ao mudar os dados do usuário no banco de dado o mesmo
021
contiue logado.
022  
023 $_SG['servidor'] = 'localhost';    // Servidor MySQL
024 $_SG['usuario'] = 'root';          // Usuário MySQL

025 $_SG['senha'] = '';                // Senha MySQL


026 $_SG['banco'] = 'test';            // Banco de dados MySQL
027  
028 $_SG['paginaLogin'] = 'login.php'; // Página de login
029  
$_SG['tabela'] = 'usuarios';       // Nome da tabela onde os
030
usuários são salvos
031 // ==============================
032  
033 // ======================================
034 //   ~ Não edite a partir deste ponto ~
035 // ======================================
036  
037 // Verifica se precisa fazer a conexão com o MySQL
038 if ($_SG['conectaServidor'] == true) {
$_SG['link'] = mysql_connect($_SG['servidor'], $_SG['usuario'],
039 $_SG['senha']) or die("MySQL: Não foi possível conectar-se ao
servidor [".$_SG['servidor']."].");
mysql_select_db($_SG['banco'], $_SG['link']) or die("MySQL: Não foi
040
possível conectar-se ao banco de dados [".$_SG['banco']."].");
041 }
042  
043 // Verifica se precisa iniciar a sessão
044 if ($_SG['abreSessao'] == true) {
045 session_start();
046 }

047  
048 /**
049 * Função que valida um usuário e senha
050 *
051 * @param string $usuario - O usuário a ser validado
052 * @param string $senha - A senha a ser validada

053 *
054 * @return bool - Se o usuário foi validado ou não (true/false)
055 */
056 function validaUsuario($usuario, $senha) {
057 global $_SG;
058  
059 $cS = ($_SG['caseSensitive']) ? 'BINARY' : '';
060  
061 // Usa a função addslashes para escapar as aspas
062 $nusuario = addslashes($usuario);
063 $nsenha = addslashes($senha);
064  
065 // Monta uma consulta SQL (query) para procurar um usuário
$sql = "SELECT `id`, `nome` FROM `".$_SG['tabela']."` WHERE ".$cS."
066 `usuario` = '".$nusuario."' AND ".$cS." `senha` = '".$nsenha."'
LIMIT 1";
067 $query = mysql_query($sql);
068 $resultado = mysql_fetch_assoc($query);
069  
070 // Verifica se encontrou algum registro
071 if (empty($resultado)) {
072 // Nenhum registro foi encontrado => o usuário é inválido
073 return false;
074  
075 } else {
076 // O registro foi encontrado => o usuário é valido
077  
078 // Definimos dois valores na sessão com os dados do usuário
$_SESSION['usuarioID'] = $resultado['id']; // Pega o valor da
079
coluna 'id do registro encontrado no MySQL
$_SESSION['usuarioNome'] = $resultado['nome']; // Pega o valor da
080
coluna 'nome' do registro encontrado no MySQL
081  
082 // Verifica a opção se sempre validar o login
083 if ($_SG['validaSempre'] == true) {
084 // Definimos dois valores na sessão com os dados do login
085 $_SESSION['usuarioLogin'] = $usuario;
086 $_SESSION['usuarioSenha'] = $senha;
087 }
088  
089 return true;
090 }
091 }
092  
093 /**
094 * Função que protege uma página
095 */
096 function protegePagina() {
097 global $_SG;
098  
if (!isset($_SESSION['usuarioID']) OR !
099
isset($_SESSION['usuarioNome'])) {
100 // Não há usuário logado, manda pra página de login

101 expulsaVisitante();
} else if (!isset($_SESSION['usuarioID']) OR !
102
isset($_SESSION['usuarioNome'])) {
103 // Há usuário logado, verifica se precisa validar o login novamente
104 if ($_SG['validaSempre'] == true) {
// Verifica se os dados salvos na sessão batem com os dados do
105
banco de dados
if (!validaUsuario($_SESSION['usuarioLogin'],
106
$_SESSION['usuarioSenha'])) {
107 // Os dados não batem, manda pra tela de login
108 expulsaVisitante();
109 }
110 }
111 }
112 }
113  
114 /**
115 * Função para expulsar um visitante
116 */
117 function expulsaVisitante() {
118 global $_SG;

119  
120 // Remove as variáveis da sessão (caso elas existam)
unset($_SESSION['usuarioID'], $_SESSION['usuarioNome'],
121
$_SESSION['usuarioLogin'], $_SESSION['usuarioSenha']);
122  
123 // Manda pra tela de login
124 header("Location: ".$_SG['paginaLogin']);
125 }

Não vou poder explicar todas as funções do arquivo pq é muita coisa.. Mas todas elas
estão devidamente comentadas e documentadas… É só olhar.

Com esse arquivos nós já nos conectamos automaticamente ao servidor MySQL, então
se você usar outra forma pra fazer a conexão, vá na parte de configurações do
seguranca.php e defina a variável $_SG['conectaServidor'] pra falso (false). O mesmo
acontece pra sessão com a variável $_SG['abreSessao'].

Agora é só incluir essas linhas no topo de cada arquivo que deverá ter o acesso restrito:

include("seguranca.php"); // Inclui o arquivo com o sistema de


1
segurança
2 protegePagina(); // Chama a função que protege a página

Quando vocês quiserem exibir o nome do usuário logado, é só fazer isso:

echo "Olá, " .


1 $_SESSION['usuarioNome']
;

O formulário de Login em XHTML

Vamos criar agora o nosso formulário que será onde o


visitante entrará com os dados e será mandado para a
pagina validacao.php onde os dados serão validados
(ohh).

01 <!-- Formulário de Login -->


02 <form action="validacao.php" method="post">
03 <fieldset>
04 <legend>Dados de Login</legend>
05     <label for="txUsuario">Usuário</label>
    <input type="text" name="usuario"
06
id="txUsuario" maxlength="25" />
07     <label for="txSenha">Senha</label>
    <input type="password" name="senha"
08
id="txSenha" />
09  
10     <input type="submit" value="Entrar" />
11 </fieldset>
12 </form>

Como esse artigo não é uma aula sobre formulários e


método POST eu vou pular a parte que fala sobre os
names desses inputs e a relação deles com o PHP em si.

A validação dos dados

Já temos o banco de dados e o formulário de login…


Agora vamos começar a fazer a validação. Os próximos
códigos deverão ser colocados dentro do validacao.php
que irá tratar os dados recebidos do formulário:

Primeiro de tudo nós precisamos verificar se o usuário de


fato preencheu algo no formulário, caso contrário
mandamos ele de volta para o index.php:

1 <?php
2  
// Verifica se houve POST e se o usuário ou
3
a senha é(são) vazio(s)
if (!empty($_POST) AND
4 (empty($_POST['usuario']) OR
empty($_POST['senha']))) {
5     header("Location: index.php"); exit;
6}

7  
8 ?>
Com isso, todo código que vier depois desse if estará
seguro de que os dados foram preenchidos no formulário.

Agora nós iremos abrir uma conexão com o MySQL mas


essa conexão pode ser feita de outra forma, até antes do if
se você preferir… Depois de abrir a conexão nós iremos
transmitir os dois valores inseridos pelo visitante (usuário
e senha) para novas variáveis e usaremos o
mysql_real_escape_string() para evitar erros no
MySQL.

01 <?php
02  
// Verifica se houve POST e se o usuário
03
ou a senha é(são) vazio(s)
if (!empty($_POST) AND
04 (empty($_POST['usuario']) OR
empty($_POST['senha']))) {
05     header("Location: index.php"); exit;
06 }

07  
08 // Tenta se conectar ao servidor MySQL
mysql_connect('localhost', 'root', '') or
09
trigger_error(mysql_error());
// Tenta se conectar a um banco de dados
10
MySQL
mysql_select_db('usuarios') or
11
trigger_error(mysql_error());
12  
$usuario =
13 mysql_real_escape_string($_POST['usuario'])
;
$senha =
14
mysql_real_escape_string($_POST['senha']);
15  
16 ?>
Agora é hora de validar os dados contra a tabela de
usuários:

01 <?php
02  
// Verifica se houve POST e se o usuário
03
ou a senha é(são) vazio(s)
if (!empty($_POST) AND
04 (empty($_POST['usuario']) OR
empty($_POST['senha']))) {
05     header("Location: index.php"); exit;
06 }
07  
08 // Tenta se conectar ao servidor MySQL
mysql_connect('localhost', 'root', '') or
09
trigger_error(mysql_error());
// Tenta se conectar a um banco de dados
10
MySQL
mysql_select_db('usuarios') or
11
trigger_error(mysql_error());
12  
$usuario =
13 mysql_real_escape_string($_POST['usuario'])
;
$senha =
14
mysql_real_escape_string($_POST['senha']);
15  
16 // Validação do usuário/senha digitados
$sql = "SELECT `id`, `nome`, `nivel` FROM
`usuarios` WHERE (`usuario` = '". $usuario
17
."') AND (`senha` = '". sha1($senha) ."')
AND (`ativo` = 1) LIMIT 1";
18 $query = mysql_query($sql);

19 if (mysql_num_rows($query) != 1) {
    // Mensagem de erro quando os dados são
20
inválidos e/ou o usuário não foi encontrado
21     echo "Login inválido!"; exit;
22 } else {
    // Salva os dados encontados na
23
variável $resultado
24     $resultado = mysql_fetch_assoc($query);
25 }
26  
27 ?>
Repare que estamos buscando registros que tenham o
usuário igual ao digitado pelo visitante e que tenham uma
senha igual a versão SHA1 da senha digitada pelo
visitante… Também buscamos apenas por registros de
usuários que estejam ativos, assim quando você precisar
remover um usuário do sistema, mas não pode
simplesmente excluir o registro é só trocar o valor da
coluna ativo pra zero.

A consulta gerada fica mais ou menos assim:

SELECT `id`, `nome`, `nivel` FROM `usuarios`


WHERE (`usuario` = 'a') AND (`senha` =
'e9d71f5ee7c92d6dc9e92ffdad17b8bd49418f98')
AND (`ativo` = 1) LIMIT 1
Depois de rodar a consulta (query) nós verificamos se o
número de resultados encontrados (ou não) é diferente de
um, caso seja é exibida uma mensagem de erro
acompanhada de um exit que finaliza o script… Caso ele
encontre apenas um resultado nós temos o nosso usuário
e já puxamos o seu ID, nome e nível de acesso do banco
de dados.

Salvando os dados na sessão

Agora nós precisamos salvar os dados encontrados na


sessão pois eles serão utilizados mais tarde, em outras
páginas e eles precisam “persistir” até lá… Depois de
salvar os dados na sessão nós iremos redirecionar o
visitante para uma página restrita:

19 if (mysql_num_rows($query) != 1) {
    // Mensagem de erro quando os dados são
20
inválidos e/ou o usuário não foi encontrado
21     echo "Login inválido!"; exit;
22 } else {
    // Salva os dados encontados na
23
variável $resultado
24     $resultado = mysql_fetch_assoc($query);

25  
26     // Se a sessão não existir, inicia uma
27     if (!isset($_SESSION)) session_start();
28  
    // Salva os dados encontrados na
29
sessão
    $_SESSION['UsuarioID'] =
30
$resultado['id'];
    $_SESSION['UsuarioNome'] =
31
$resultado['nome'];
    $_SESSION['UsuarioNivel'] =
32
$resultado['nivel'];
33  
34     // Redireciona o visitante
35     header("Location: restrito.php"); exit;
36 }

Verificando se o usuário está logado

Nosso sistema de login está quase completo! Agora só


precisamos verificar se o usuário está logado no sistema e
se o seu o nível de acesso condiz com o da página…
Vamos agora escrever um pequeno bloco de PHP no
início do arquivo restrito.php (que só deve ser acessado
por usuários logados):

01 <?php
02  
// A sessão precisa ser iniciada em cada
03
página diferente
04 if (!isset($_SESSION)) session_start();

05  
// Verifica se não há a variável da sessão
06
que identifica o usuário
07 if (!isset($_SESSION['UsuarioID'])) {
08     // Destrói a sessão por segurança
09     session_destroy();
    // Redireciona o visitante de volta pro
10
login
11     header("Location: index.php"); exit;
12 }

13  
14 ?>
15  
16 <h1>Página restrita</h1>
<p>Olá, <?php echo
17
$_SESSION['UsuarioNome']; ?>!</p>
Pronto meu amigo! O seu sistema de login está pronto
para funcionar… Só vamos fazer alguns incrementos para
ele ficar mais “usável”… Agora você vai ver como fazer
a verificação de usuário logado e de nível de acesso, por
exemplo para uma página onde apenas os
administradores possam ter acesso:

01 <?php
02  
// A sessão precisa ser iniciada em cada
03
página diferente
04 if (!isset($_SESSION)) session_start();

05  
06 $nivel_necessario = 2;
07  
// Verifica se não há a variável da sessão
08
que identifica o usuário
if (!isset($_SESSION['UsuarioID']) OR
09 ($_SESSION['UsuarioNivel'] <
$nivel_necessario)) {
10     // Destrói a sessão por segurança

11     session_destroy();
    // Redireciona o visitante de volta pro
12
login
13     header("Location: index.php"); exit;
14 }

15  
16 ?>
Código de Logout

O arquivo logout.php é tão simples que pode ter uma


linha só:

<?php session_start(); session_destroy();


1
header("Location: index.php"); exit; ?>
Ou se você preferir, uma versão mais extensa:

1 <?php
2     session_start(); // Inicia a sessão
    session_destroy(); // Destrói a sessão
3
limpando todos os valores salvos
    header("Location: index.php"); exit; //
4
Redireciona o visitante
5 ?>

Você também pode gostar