PHP - Sistema de Login com Níveis de Acesso

9
PHP: Sistema de Login com Níveis de Acesso Veja neste artigo como desenvolver um sistema de login com nível de acesso de usuário 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 não é entregar um script pronto, mas sim te mostrar o “caminho das pedras” enquanto você é quem criará o seu próprio sistema. Versões utilizadas nesse artigo: PHP 5.2.9 e MySQL 5.0.5. O nosso sistema consistirá em um login simples , validado por usuário e senha (encriptada) contra uma tabela no banco de dados e armazenando os dados na sessão. Haverá dois níveis de acesso para os nossos usuários: normal (1) e administrador (2). Criando a Tabela MySQL Você pode executar esse código MySQL para criar a nossa tabela de usuários que tem 7 campos: id, nome, usuario, senha, niveis, ativo e cadastro: Listagem 1: Criando a Tabela MySQL 1 2 3 4 5 6 7 8 9 CREATE TABLE IF NOT EXISTS `usuarios` ( `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `nome` VARCHAR( 50 ) NOT NULL , `usuario` VARCHAR( 25 ) NOT NULL , `senha` VARCHAR( 40 ) NOT NULL , `email` VARCHAR( 100 ) NOT NULL , `nivel` INT(1) UNSIGNED NOT NULL DEFAULT '1', `ativo` BOOL NOT NULL DEFAULT '1', `cadastro` DATETIME NOT NULL , PRIMARY KEY (`id`), UNIQUE KEY `usuario` (`usuario`),

Transcript of PHP - Sistema de Login com Níveis de Acesso

Page 1: PHP - Sistema de Login com Níveis de Acesso

PHP: Sistema de Login com Níveis de AcessoVeja neste artigo como desenvolver um sistema de login com nível de acesso de usuário 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 não é entregar um script pronto, mas sim te mostrar o “caminho das pedras” enquanto você é quem criará o seu próprio sistema.

Versões utilizadas nesse artigo: PHP 5.2.9 e MySQL 5.0.5.

O nosso sistema consistirá em um login simples, validado por usuário e senha (encriptada) contra uma tabela no banco de dados e armazenando os dados na sessão. Haverá dois níveis de acesso para os nossos usuários: normal (1) e administrador (2).

Criando a Tabela MySQL

Você pode executar esse código MySQL para criar a nossa tabela de usuários que tem 7 campos: id, nome, usuario, senha, niveis, ativo e cadastro:

Listagem 1: Criando a Tabela MySQL

12345678910111213

CREATE TABLE IF NOT EXISTS `usuarios` (        `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,        `nome` VARCHAR( 50 ) NOT NULL ,        `usuario` VARCHAR( 25 ) NOT NULL ,        `senha` VARCHAR( 40 ) NOT NULL ,        `email` VARCHAR( 100 ) NOT NULL ,        `nivel` INT(1) UNSIGNED NOT NULL DEFAULT '1',        `ativo` BOOL NOT NULL DEFAULT '1',        `cadastro` DATETIME NOT NULL ,        PRIMARY KEY (`id`),        UNIQUE KEY `usuario` (`usuario`),        KEY `nivel` (`nivel`)    ) ENGINE=MyISAM ;

Com isso você já tem uma tabela pronta para o nosso tutorial… Rode esse script se quiser alimentar a tabela com alguns usuários de teste:

Page 2: PHP - Sistema de Login com Níveis de Acesso

Listagem 2: Inserindo dados na tabela

12

INSERT INTO `usuarios` VALUES (NULL, 'Usuário Teste', 'demo', SHA1( 'demo'), '[email protected]', 1, 1, NOW( ));    INSERT INTO `usuarios` VALUES (NULL, 'Administrador Teste',

'admin', SHA1('admin' ), '[email protected]', 2, 1, NOW( ));

Como vocês podem perceber, o nosso campo de senha tem 40 caracteres e quando cadastramos os usuários testes usamos isso significa que usaremos uma senha encriptada.

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).

Listagem 3: Formulário de login

123456789101112

<!-- Formulário de Login -->    <form action="validacao.php" method="post">    <fieldset>    <legend>Dados de Login</legend>        <label for="txUsuario">Usuário</label>        <input type="text" name="usuario" id="txUsuario" maxlength="25" />        <label for="txSenha">Senha</label>        <input type="password" name="senha" id="txSenha" />

        <input type="submit" value="Entrar" />    </fieldset>    </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 em PHP

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:

Listagem 4: Verificando se o input foi preenchido

12

<?php

    // Verifica se houve POST e se o usuário ou a senha é(são)

Page 3: PHP - Sistema de Login com Níveis de Acesso

345678

vazio(s)    if (!empty($_POST) AND (empty($_POST['usuario']) OR empty($_POST['senha']))) {        header("Location: index.php"); exit;    }

    ?>

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.

Listagem 6: conectando com o MySQL

12345678910111213141516

<?php

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

    // Tenta se conectar ao servidor MySQL    mysql_connect('localhost', 'root', '') or trigger_error(mysql_error());    // Tenta se conectar a um banco de dados MySQL    mysql_select_db('usuarios') or trigger_error(mysql_error());

    $usuario = mysql_real_escape_string($_POST['usuario']);    $senha = mysql_real_escape_string($_POST['senha']);

    ?>

Agora é hora de validar os dados contra a tabela de usuários:

Listagem 7: Validando Dados

12345

<?php

    // Verifica se houve POST e se o usuário ou a senha é(são) vazio(s)    if (!empty($_POST) AND (empty($_POST['usuario']) OR empty($_POST['senha']))) {

Page 4: PHP - Sistema de Login com Níveis de Acesso

6789101112131415161718192021222324252627

        header("Location: index.php"); exit;    }

    // Tenta se conectar ao servidor MySQL    mysql_connect('localhost', 'root', '') or trigger_error(mysql_error());    // Tenta se conectar a um banco de dados MySQL    mysql_select_db('usuarios') or trigger_error(mysql_error());

    $usuario = mysql_real_escape_string($_POST['usuario']);    $senha = mysql_real_escape_string($_POST['senha']);

    // Validação do usuário/senha digitados    $sql = "SELECT `id`, `nome`, `nivel` FROM `usuarios` WHERE (`usuario` = '".$usuario ."') AND (`senha` = '". sha1($senha) ."') AND (`ativo` = 1) LIMIT 1";    $query = mysql_query($sql);    if (mysql_num_rows($query) != 1) {        // Mensagem de erro quando os dados são inválidos e/ou o usuário não foi encontrado        echo "Login inválido!"; exit;    } else {        // Salva os dados encontados na variável $resultado        $resultado = mysql_fetch_assoc($query);    }

    ?>

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:

Listagem 8: Select na tabela

Page 5: PHP - Sistema de Login com Níveis de Acesso

1SELECT `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 do PHP

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:

Listagem 9: Salvando os dados na sessão

123456789101112131415161718

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

        // Se a sessão não existir, inicia uma        if (!isset($_SESSION)) session_start();

        // Salva os dados encontrados na sessão        $_SESSION['UsuarioID'] = $resultado['id'];        $_SESSION['UsuarioNome'] = $resultado['nome'];        $_SESSION['UsuarioNivel'] = $resultado['nivel'];

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

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

Page 6: PHP - Sistema de Login com Níveis de Acesso

agora escrever um pequeno bloco de PHP no início do arquivo restrito.php (que só deve ser acessado por usuários logados):

Listagem 10: Verificando se o usuário está logado

1234567891011121314151617

<?php

    // A sessão precisa ser iniciada em cada página diferente    if (!isset($_SESSION)) session_start();

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

    ?>

    <h1>Página restrita</h1>    <p>Olá, <?php echo $_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:

Listagem 11: Verificando usuário logado

123456789101

<?php

    // A sessão precisa ser iniciada em cada página diferente    if (!isset($_SESSION)) session_start();

    $nivel_necessario = 2;

    // Verifica se não há a variável da sessão que identifica o usuário    if (!isset($_SESSION['UsuarioID']) OR ($_SESSION['UsuarioNivel'] <$nivel_necessario)) {        // Destrói a sessão por segurança        session_destroy();        // Redireciona o visitante de volta pro login        header("Location: index.php"); exit;

Page 7: PHP - Sistema de Login com Níveis de Acesso

11213141516

    }

    ?>

Código de Logout

O arquivo logout.php é tão simples que pode ter uma linha só:

Listagem 12: Código de Logout

1<?php session_start(); session_destroy(); header("Location: index.php");exit; ?>

Ou se você preferir, uma versão mais extensa:

Listagem 13: Código de logout mais extenso

12345

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

Quem não conseguir fazer um sistema de login depois dessa aula não 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 Níveis de Permissão

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