Autor: aldey freire | Publicado: 2012-01-27T08:26:00-03:00








Criando um sistema de login com PHP e MySQL

155


9 de março de 2009, em&nbsp;MySQL,&nbsp;PHP,&nbsp;Tutoriais, por&nbsp;Thiago Belem





como&nbsp;criar um sistema de login&nbsp;simples&nbsp;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&nbsp;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:

DROP TABLE IF EXISTS `usuarios`;
CREATE TABLE IF NOT EXISTS `usuarios` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`nome` varchar(100) NOT NULL,
`usuario` varchar(50) NOT NULL,
`senha` varchar(50) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `usuario` (`usuario`)
) 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&nbsp;login.php:
&lt;form method="post" action="valida.php"&gt;
&lt;label&gt;Usuário&lt;/label&gt;
&lt;input type="text" name="usuario" maxlength="50" /&gt;

&lt;label&gt;Senha&lt;/label&gt;
&lt;input type="password" name="senha" maxlength="50" /&gt;

&lt;input type="submit" value="Entrar" /&gt;
&lt;/form&gt;



Esse formulário, com apenas dois campos, manda pra página&nbsp;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&nbsp;valida.php:
// Inclui o arquivo com o sistema de segurança
include("seguranca.php");

// Verifica se um formulário foi enviado
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// 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 preenchido
$usuario = (isset($_POST['usuario'])) ? $_POST['usuario'] : '';
$senha = (isset($_POST['senha'])) ? $_POST['senha'] : '';

// Utiliza uma função criada no seguranca.php pra validar os dados digitados
if (validaUsuario($usuario, $senha) == true) {
// O usuário e a senha digitados foram validados, manda pra página interna
header("Location: index.php");
} else {
// O usuário e/ou a senha são inválidos, manda de volta pro form de login
// Para alterar o endereço da página de login, verifique o arquivo seguranca.php
expulsaVisitante();
}
}



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

../pasta_do_seu_site/index.php&nbsp;» Página intera a ser protegida
../pasta_do_seu_site/login.php&nbsp;» Página com o formulário de login
../pasta_do_seu_site/valida.php&nbsp;» Página que faz a validação dos dados do formulário

Agora vamos criar o arquivo&nbsp;seguranca.php&nbsp;na mesma pasta dos demais arquivos:
/**
* Sistema de segurança com acesso restrito
*
* Usado para restringir o acesso de certas páginas do seu site
*
* @author Thiago Belem &lt;contato@thiagobelem.net&gt;
* @link http://thiagobelem.net/
*
* @version 1.0
* @package SistemaSeguranca
*/

//  Configurações do Script
// ==============================
$_SG['conectaServidor'] = true;    // Abre uma conexão com o servidor MySQL?
$_SG['abreSessao'] = true;         // Inicia a sessão com um session_start()?

// Usar case-sensitive? Onde 'thiago' é diferente de 'THIAGO'
$_SG['caseSensitive'] = false;     

 // Deseja validar o usuário e a senha a cada carregamento de página?
$_SG['validaSempre'] = true;      
// Evita que, ao mudar os dados do usuário no banco de dado o mesmo contiue logado.

$_SG['servidor'] = 'localhost';    // Servidor MySQL
$_SG['usuario'] = 'root';          // Usuário MySQL
$_SG['senha'] = '';                // Senha MySQL
$_SG['banco'] = 'test';            // Banco de dados MySQL

$_SG['paginaLogin'] = 'login.php'; // Página de login

$_SG['tabela'] = 'usuarios';       // Nome da tabela onde os usuários são salvos
// ==============================

// ======================================
//   ~ Não edite a partir deste ponto ~
// ======================================

// Verifica se precisa fazer a conexão com o MySQL
if ($_SG['conectaServidor'] == true) {
$_SG['link'] = mysql_connect($_SG['servidor'], $_SG['usuario'],&nbsp;
$_SG['senha']) or die("MySQL:
 Não foi possível conectar-se ao servidor [".$_SG['servidor']."].");
mysql_select_db($_SG['banco'], $_SG['link'])&nbsp;
or die("MySQL: Não foi possível conectar-se ao banco de dados&nbsp;
[".$_SG['banco']."].");
}

// Verifica se precisa iniciar a sessão
if ($_SG['abreSessao'] == true) {
session_start();
}

/**
* Função que valida um usuário e senha
*
* @param string $usuario - O usuário a ser validado
* @param string $senha - A senha a ser validada
*
* @return bool - Se o usuário foi validado ou não (true/false)
*/
function validaUsuario($usuario, $senha) {
global $_SG;

$cS = ($_SG['caseSensitive']) ? 'BINARY' : '';

// Usa a função addslashes para escapar as aspas
$nusuario = addslashes($usuario);
$nsenha = addslashes($senha);

// Monta uma consulta SQL (query) para procurar um usuário
$sql = "SELECT `id`, `nome` FROM `".$_SG['tabela']."`&nbsp;
WHERE ".$cS." `usuario` = '".$nusuario."' AND ".$cS."&nbsp;
`senha` = '".$nsenha."' LIMIT 1";

$query = mysql_query($sql);
$resultado = mysql_fetch_assoc($query);

// Verifica se encontrou algum registro
if (empty($resultado)) {
// Nenhum registro foi encontrado =&gt; o usuário é inválido
return false;

} else {
// O registro foi encontrado =&gt; o usuário é valido

// Definimos dois valores na sessão com os dados do usuário

// Pega o valor da coluna 'id do registro encontrado no MySQL
$_SESSION['usuarioID'] = $resultado['id']; 

// Pega o valor da coluna 'nome' do registro encontrado no MySQL
$_SESSION['usuarioNome'] = $resultado['nome']; 
// Verifica a opção se sempre validar o login
if ($_SG['validaSempre'] == true) {
// Definimos dois valores na sessão com os dados do login
$_SESSION['usuarioLogin'] = $usuario;
$_SESSION['usuarioSenha'] = $senha;
}

return true;
}
}

/**
* Função que protege uma página
*/
function protegePagina() {
global $_SG;

if (!isset($_SESSION['usuarioID']) OR !isset($_SESSION['usuarioNome'])) {
// Não há usuário logado, manda pra página de login
expulsaVisitante();
} else if (!isset($_SESSION['usuarioID']) OR !isset($_SESSION['usuarioNome'])) {
// Há usuário logado, verifica se precisa validar o login novamente
if ($_SG['validaSempre'] == true) {
// Verifica se os dados salvos na sessão batem com os dados do banco de dados
if (!validaUsuario($_SESSION['usuarioLogin'], $_SESSION['usuarioSenha'])) {
// Os dados não batem, manda pra tela de login
expulsaVisitante();
}
}
}
}

/**
* Função para expulsar um visitante
*/
function expulsaVisitante() {
global $_SG;

// Remove as variáveis da sessão (caso elas existam)
unset($_SESSION['usuarioID'], $_SESSION['usuarioNome'],&nbsp;
$_SESSION['usuarioLogin'], $_SESSION['usuarioSenha']);

// Manda pra tela de login
header("Location: ".$_SG['paginaLogin']);
}



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,&nbsp;

vá na parte de configurações do&nbsp;seguranca.phpe defina a variável&nbsp;$_SG['conectaServidor']&nbsp;pra falso (false).

&nbsp;O mesmo acontece pra sessão com a variável&nbsp;$_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 segurança
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á, " . $_SESSION['usuarioNome'];



Veja mais sobre escrever e pegar valores da sessão (coisa que acontece muito nesse sistema de login)
no tópico&nbsp;Aprendendo a usar sessões no PHP.

Viram como é fácil?

Pra quem quiser um tutorial mais explicado e detalhado recomendo:&nbsp;

Como criar um Sistema de Login com Níveis de Permissão&nbsp;(passo-a-passo).
Nota:&nbsp;Alguns de vocês devem ter notado que durante essa semana,&nbsp;
no post&nbsp;Criando Sistemas Seguros, falei sobre&nbsp;não usar&nbsp;nomes óbvios para tabelas de usuários.&nbsp;
Mas esse exemplo é apenas explicativo, você pode mudar o nome da tabela de usuários se preferir&nbsp;
e depois é só alterar a variável no bloco de configurações dentro do&nbsp;seguranca.php.

























Artigo originalmente publicado em 9 de março de 2009 por Thiago Belem: Criando um sistema de login com PHP e MySQL