quarta-feira, 6 de março de 2013

Criando um sistema de login com PHP e MySQL


Achei esse tutorial na net Muito Bom.
É 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:
1DROP TABLE IF EXISTS `usuarios`;
2CREATE 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,
7PRIMARY KEY (`id`),
8UNIQUE 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
02include("seguranca.php");
03 
04// Verifica se um formulário foi enviado
05if ($_SERVER['REQUEST_METHOD'] == 'POST') {
06// Salva duas variáveis com o que foi digitado no formulário
07// Detalhe: faz uma verificação com isset() pra saber se o campo foi preenchido
08$usuario = (isset($_POST['usuario'])) ? $_POST['usuario'] : '';
09$senha = (isset($_POST['senha'])) ? $_POST['senha'] : '';
10 
11// Utiliza uma função criada no seguranca.php pra validar os dados digitados
12if (validaUsuario($usuario$senha) == true) {
13// O usuário e a senha digitados foram validados, manda pra página interna
14header("Location: index.php");
15else {
16// O usuário e/ou a senha são inválidos, manda de volta pro form de login
17// Para alterar o endereço da página de login, verifique o arquivo seguranca.php
18expulsaVisitante();
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>
008*
009* @version 1.0
010* @package SistemaSeguranca
011*/
012 
013//  Configurações do Script
014// ==============================
015$_SG['conectaServidor'] = true;    // Abre uma conexão com o servidor MySQL?
016$_SG['abreSessao'] = true;         // Inicia a sessão com um session_start()?
017 
018$_SG['caseSensitive'] = false;     // Usar case-sensitive? Onde 'thiago' é diferente de 'THIAGO'
019 
020$_SG['validaSempre'] = true;       // Deseja validar o usuário e a senha a cada carregamento de página?
021// Evita que, ao mudar os dados do usuário no banco de dado o mesmo 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 
030$_SG['tabela'] = 'usuarios';       // Nome da tabela onde os 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
038if ($_SG['conectaServidor'] == true) {
039$_SG['link'] = mysql_connect($_SG['servidor'], $_SG['usuario'],$_SG['senha']) or die("MySQL: Não foi possível conectar-se ao servidor [".$_SG['servidor']."].");
040mysql_select_db($_SG['banco'], $_SG['link']) or die("MySQL: Não foi possível conectar-se ao banco de dados [".$_SG['banco']."].");
041}
042 
043// Verifica se precisa iniciar a sessão
044if ($_SG['abreSessao'] == true) {
045session_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*/
056function validaUsuario($usuario$senha) {
057global $_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
066$sql "SELECT `id`, `nome` FROM `".$_SG['tabela']."` WHERE ".$cS." `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
071if (empty($resultado)) {
072// Nenhum registro foi encontrado => o usuário é inválido
073return false;
074 
075else {
076// O registro foi encontrado => o usuário é valido
077 
078// Definimos dois valores na sessão com os dados do usuário
079$_SESSION['usuarioID'] = $resultado['id']; // Pega o valor da coluna 'id do registro encontrado no MySQL
080$_SESSION['usuarioNome'] = $resultado['nome']; // Pega o valor da coluna 'nome' do registro encontrado no MySQL
081 
082// Verifica a opção se sempre validar o login
083if ($_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 
089return true;
090}
091}
092 
093/**
094* Função que protege uma página
095*/
096function protegePagina() {
097global $_SG;
098 
099if (!isset($_SESSION['usuarioID']) OR !isset($_SESSION['usuarioNome'])) {
100// Não há usuário logado, manda pra página de login
101expulsaVisitante();
102else if (!isset($_SESSION['usuarioID']) OR !isset($_SESSION['usuarioNome'])) {
103// Há usuário logado, verifica se precisa validar o login novamente
104if ($_SG['validaSempre'] == true) {
105// Verifica se os dados salvos na sessão batem com os dados do banco de dados
106if (!validaUsuario($_SESSION['usuarioLogin'],$_SESSION['usuarioSenha'])) {
107// Os dados não batem, manda pra tela de login
108expulsaVisitante();
109}
110}
111}
112}
113 
114/**
115* Função para expulsar um visitante
116*/
117function expulsaVisitante() {
118global $_SG;
119 
120// Remove as variáveis da sessão (caso elas existam)
121unset($_SESSION['usuarioID'], $_SESSION['usuarioNome'],$_SESSION['usuarioLogin'], $_SESSION['usuarioSenha']);
122 
123// Manda pra tela de login
124header("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:
1include("seguranca.php"); // Inclui o arquivo com o sistema de segurança
2protegePagina(); // Chama a função que protege a página
Quando vocês quiserem exibir o nome do usuário logado, é só fazer isso:
1echo "Olá, " $_SESSION['usuarioNome'];


Fonte: http://blog.thiagobelem.net/criando-um-sistema-de-login-com-php-e-mysql/

Um comentário:

  1. Bom dia. Bom código me ajudou muito, mas tenho uma observação a fazer:
    Na linha 066 do arquivo segurança php há um pequeno erro que não permite que o sistema funcione.
    066: $sql = "SELECT `id`, `nome` FROM `".$_SG['tabela']."` WHERE ".$cS."


    ao invéz de ser ..."SELECT 'id', 'nome'... deve ser "SELECT 'usuario', 'senha'...
    Abraço e parabéns.

    ResponderExcluir