Sie sind auf Seite 1von 6

PHP: Sistema de Login com Nveis de Acesso

Veja neste artigo como desenvolver um sistema de login com nvel de acesso de usurio comum e administrador usando PHP e MySQL. por Thiago Belem

Fala pessoal, hoje vamos ver como se faz um sistema de login passo-a-passo. O meu intuito nesse artigo no entregar um script pronto, mas sim te mostrar o caminho das pedras enquanto voc quem criar o seu prprio sistema. Verses utilizadas nesse artigo: PHP 5.2.9 e MySQL 5.0.5. O nosso sistema consistir em um login simples, validado por usurio e senha (encriptada) contra uma tabela no banco de dados e armazenando os dados na sesso. Haver dois nveis de acesso para os nossos usurios: normal (1) e administrador (2).

Criando a Tabela MySQL


Voc pode executar esse cdigo MySQL para criar a nossa tabela de usurios que tem 7 campos: id, nome, usuario, senha, niveis, ativo e cadastro: Listagem 1: Criando a Tabela MySQL 1 2 CREATE TABLE IF NOT EXISTS `usuarios` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, 3 `nome` VARCHAR( 50 ) NOT NULL , 4 `usuario` VARCHAR( 25 ) NOT NULL , 5 `senha` VARCHAR( 40 ) NOT NULL , 6 `email` VARCHAR( 100 ) NOT NULL , `nivel` INT(1) UNSIGNED NOT NULL DEFAULT '1', 7 `ativo` BOOL NOT NULL DEFAULT '1', 8 `cadastro` DATETIME NOT NULL , 9 PRIMARY KEY (`id`), 10 UNIQUE KEY `usuario` (`usuario`), 11 KEY `nivel` (`nivel`) ) ENGINE=MyISAM ; 12 13 Com isso voc j tem uma tabela pronta para o nosso tutorial Rode esse script se quiser alimentar a tabela com alguns usurios de teste: Listagem 2: Inserindo dados na tabela 1'demo'), 'usuario@demo.com.br', 1, 1, NOW( ));
INSERT INTO `usuarios` VALUES (NULL, 'Usurio Teste', 'demo', SHA1(

INSERT INTO `usuarios` VALUES (NULL, 'Administrador Teste', 'admin', SHA1('admin' ), 'admin@demo.com.br', 2, 1, NOW( ));

Como vocs podem perceber, o nosso campo de senha tem 40 caracteres e quando cadastramos os usurios testes usamos isso significa que usaremos uma senha encriptada.

O formulrio de Login em XHTML


Vamos criar agora o nosso formulrio que ser onde o visitante entrar com os dados e ser mandado para a pagina validacao.php onde os dados sero validados (ohh). Listagem 3: Formulrio de login 1 <!-- Formulrio de Login --> 2 <form action="validacao.php" method="post"> 3 <fieldset> <legend>Dados de Login</legend> 4 <label for="txUsuario">Usurio</label> 5 <input type="text" name="usuario" id="txUsuario" 6 maxlength="25" /> 7 <label for="txSenha">Senha</label> <input type="password" name="senha" id="txSenha" /> 8 9 <input type="submit" value="Entrar" /> 10 </fieldset> 11 </form> 12 Como esse artigo no uma aula sobre formulrios e mtodo POST eu vou pular a parte que fala sobre os names desses inputs e a relao deles com o PHP em si.

A validao dos dados em PHP


J temos o banco de dados e o formulrio de login Agora vamos comear a fazer a validao. Os prximos cdigos devero ser colocados dentro do validacao.php que ir tratar os dados recebidos do formulrio: Primeiro de tudo ns precisamos verificar se o usurio de fato preencheu algo no formulrio, caso contrrio mandamos ele de volta para o index.php: Listagem 4: Verificando se o input foi preenchido 1 2 // Verifica se houve POST e se o usurio ou a senha (so) 3vazio(s) 4 if (!empty($_POST) AND (empty($_POST['usuario']) OR 5empty($_POST['senha']))) { header("Location: index.php"); exit; 6 } 7 8 ?>
<?php

Com isso, todo cdigo que vier depois desse if estar seguro de que os dados foram preenchidos no formulrio. Agora ns iremos abrir uma conexo com o MySQL mas essa conexo pode ser feita de outra forma, at antes do if se voc preferir Depois de abrir a conexo ns iremos transmitir os dois valores inseridos pelo visitante (usurio e senha) para novas variveis e usaremos o mysql_real_escape_string() para evitar erros no MySQL. Listagem 6: conectando com o MySQL 1 <?php 2 // Verifica se houve POST e se o usurio ou a senha (so) 3 vazio(s) 4 if (!empty($_POST) AND (empty($_POST['usuario']) OR 5 empty($_POST['senha']))) { header("Location: index.php"); exit; 6 } 7 8 // Tenta se conectar ao servidor MySQL 9 mysql_connect('localhost', 'root', '') or 10trigger_error(mysql_error()); // Tenta se conectar a um banco de dados MySQL 11 mysql_select_db('usuarios') or trigger_error(mysql_error()); 12 13 $usuario = mysql_real_escape_string($_POST['usuario']); 14 $senha = mysql_real_escape_string($_POST['senha']); 15 16 ?> Agora hora de validar os dados contra a tabela de usurios: Listagem 7: Validando Dados 1 <?php 2 // Verifica se houve POST e se o usurio ou a senha (so) 3 vazio(s) 4 if (!empty($_POST) AND (empty($_POST['usuario']) OR 5 empty($_POST['senha']))) { 6 header("Location: index.php"); exit; } 7 8 // Tenta se conectar ao servidor MySQL 9 mysql_connect('localhost', 'root', '') or 10trigger_error(mysql_error()); 11 // Tenta se conectar a um banco de dados MySQL mysql_select_db('usuarios') or trigger_error(mysql_error()); 12 13 $usuario = mysql_real_escape_string($_POST['usuario']); 14 $senha = mysql_real_escape_string($_POST['senha']); 15 16 // Validao do usurio/senha digitados 17 $sql = "SELECT `id`, `nome`, `nivel` FROM `usuarios` WHERE 18(`usuario` = '".$usuario ."') AND (`senha` = '". sha1($senha) ."') 19AND (`ativo` = 1) LIMIT 1";

$query = mysql_query($sql); 20 if (mysql_num_rows($query) != 1) { 21 // Mensagem de erro quando os dados so invlidos e/ou o 22usurio no foi encontrado 23 echo "Login invlido!"; exit; } else { 24 // Salva os dados encontados na varivel $resultado 25 $resultado = mysql_fetch_assoc($query); 26 } 27 ?>

Repare que estamos buscando registros que tenham o usurio igual ao digitado pelo visitante e que tenham uma senha igual a verso SHA1 da senha digitada pelo visitante Tambm buscamos apenas por registros de usurios que estejam ativos, assim quando voc precisar remover um usurio do sistema, mas no pode simplesmente excluir o registro s trocar o valor da coluna ativo pra zero. A consulta gerada fica mais ou menos assim: Listagem 8: Select na tabela
SELECT `id`, `nome`, `nivel` FROM `usuarios` WHERE (`usuario` = 'a')

1AND (`senha` = 'e9d71f5ee7c92d6dc9e92ffdad17b8bd49418f98') AND


(`ativo` = 1) LIMIT 1

Depois de rodar a consulta (query) ns verificamos se o nmero de resultados encontrados (ou no) diferente de um, caso seja exibida uma mensagem de erro acompanhada de um exit que finaliza o script Caso ele encontre apenas um resultado ns temos o nosso usurio e j puxamos o seu ID, nome e nvel de acesso do banco de dados.

Salvando os dados na sesso do PHP


Agora ns precisamos salvar os dados encontrados na sesso pois eles sero utilizados mais tarde, em outras pginas e eles precisam persistir at l Depois de salvar os dados na sesso ns iremos redirecionar o visitante para uma pgina restrita: Listagem 9: Salvando os dados na sesso 1 // Mensagem de erro quando os dados so invlidos e/ou o 2 usurio no foi encontrado echo "Login invlido!"; exit; 3 } else { 4 // Salva os dados encontados na varivel $resultado 5 $resultado = mysql_fetch_assoc($query); 6 7 // Se a sesso no existir, inicia uma 8 if (!isset($_SESSION)) session_start(); 9 // Salva os dados encontrados na sesso 10 $_SESSION['UsuarioID'] = $resultado['id']; 11 $_SESSION['UsuarioNome'] = $resultado['nome']; 12 $_SESSION['UsuarioNivel'] = $resultado['nivel'];
if (mysql_num_rows($query) != 1) {

13 14 15 16 17 18

// Redireciona o visitante header("Location: restrito.php"); exit; }

Verificando se o usurio est logado


Nosso sistema de login est quase completo! Agora s precisamos verificar se o usurio est logado no sistema e se o seu o nvel de acesso condiz com o da pgina Vamos agora escrever um pequeno bloco de PHP no incio do arquivo restrito.php (que s deve ser acessado por usurios logados): Listagem 10: Verificando se o usurio est logado 1 <?php 2 3 // A sesso precisa ser iniciada em cada pgina diferente 4 if (!isset($_SESSION)) session_start(); 5 6 // Verifica se no h a varivel da sesso que identifica o 7 usurio if (!isset($_SESSION['UsuarioID'])) { 8 // Destri a sesso por segurana 9 session_destroy(); 10 // Redireciona o visitante de volta pro login header("Location: index.php"); exit; 11 } 12 13 ?> 14 15 <h1>Pgina restrita</h1> 16 <p>Ol, <?php echo $_SESSION['UsuarioNome']; ?>!</p> 17 Pronto meu amigo! O seu sistema de login est pronto para funcionar S vamos fazer alguns incrementos para ele ficar mais usvel Agora voc vai ver como fazer a verificao de usurio logado e de nvel de acesso, por exemplo para uma pgina onde apenas os administradores possam ter acesso: Listagem 11: Verificando usurio logado 1 <?php 2 // A sesso precisa ser iniciada em cada pgina diferente 3 if (!isset($_SESSION)) session_start(); 4 5 $nivel_necessario = 2; 6 7 // Verifica se no h a varivel da sesso que identifica o 8 usurio if (!isset($_SESSION['UsuarioID']) OR ($_SESSION['UsuarioNivel'] 9

10<$nivel_necessario)) { // Destri a sesso por segurana 11 session_destroy(); 12 // Redireciona o visitante de volta pro login 13 header("Location: index.php"); exit; } 14 15 ?> 16

Cdigo de Logout
O arquivo logout.php to simples que pode ter uma linha s: Listagem 12: Cdigo de Logout 1index.php");exit; ?>
<?php session_start(); session_destroy(); header("Location:

Ou se voc preferir, uma verso mais extensa: Listagem 13: Cdigo de logout mais extenso 1 session_start(); // Inicia a sesso 2 session_destroy(); // Destri a sesso limpando todos os 3valores salvos header("Location: index.php"); exit; // Redireciona o 4 visitante 5 ?> Quem no conseguir fazer um sistema de login depois dessa aula no vai ganhar batata frita no fim do dia! :) Pra quem quiser, aqui tem um ZIP para download com os arquivos desse artigo. Artigo originalmente publicado por Thiago Belem: Como criar um Sistema de Login com Nveis de Permisso
<?php

Read more: http://www.linhadecodigo.com.br/artigo/3577/php-sistema-de-login-comniveis-de-acesso.aspx#ixzz2ocVE71tj