Sistema de login com PHP e MySQLi


Como implementar um sistema de login em PHP com redirecionamento de nível de acesso e senha criptografada com MD5.

Para montar o layout do login será utilizado o Framework Bootstrap.


Baixar o código fonte: Clique aqui

Primeiramente vamos montar a página de login "index.php". No código abaixo somente está a estrutura do HTML sem a estruturação do layout. Para estilizar o layout será utilizado o framework Bootstrap. A página de login estilizada pode ser baixada no link disponível final deste artigo.

<?php
	//Inicializado primeira a sessão para posteriormente recuperar valores das variáveis globais. 
    session_start();
?>
<!DOCTYPE html>
<html lang="pt-br">
    <head>
        <meta charset="utf-8">
        <meta name="author" content="Cesar Szpak">
        <title>Celke - Login</title>
    </head>
    <body>
		<!-- Criado o formulário para o usuário colocar os dados de acesso.  -->
        <form method="POST" action="valida.php">
            <h2>Área Restrita</h2>
            <label>Email</label>
            <input type="email" name="email" placeholder="Email" required autofocus>
            <label>Senha</label>
            <input type="password" name="senha" placeholder="Senha" required>
            <button type="submit">Acessar</button>
        </form>
        <p>
            <?php 
			//Recuperando o valor da variável global, os erro de login.
			if(isset($_SESSION['loginErro'])){
                echo $_SESSION['loginErro'];
                unset($_SESSION['loginErro']);
            }?>
        </p>
        <p>
            <?php 
			//Recuperando o valor da variável global, deslogado com sucesso.
            if(isset($_SESSION['logindeslogado'])){
                echo $_SESSION['logindeslogado'];
                unset($_SESSION['logindeslogado']);
            }
            ?>
        </p>
    </body>
</html>

Agora vamos validar os dados digitado pelo usuário. Vamos criar a página "valida.php".

<?php
    session_start(); 
        //Incluindo a conexão com banco de dados   
    include_once("conexao.php");    
    //O campo usuário e senha preenchido entra no if para validar
    if((isset($_POST['email'])) && (isset($_POST['senha']))){
        $usuario = mysqli_real_escape_string($conn, $_POST['email']); //Escapar de caracteres especiais, como aspas, prevenindo SQL injection
        $senha = mysqli_real_escape_string($conn, $_POST['senha']);
        $senha = md5($senha);
            
        //Buscar na tabela usuario o usuário que corresponde com os dados digitado no formulário
        $result_usuario = "SELECT * FROM usuarios WHERE email = '$usuario' && senha = '$senha' LIMIT 1";
        $resultado_usuario = mysqli_query($conn, $result_usuario);
        $resultado = mysqli_fetch_assoc($resultado_usuario);
        
        //Encontrado um usuario na tabela usuário com os mesmos dados digitado no formulário
        if(isset($resultado)){
            $_SESSION['usuarioId'] = $resultado['id'];
            $_SESSION['usuarioNome'] = $resultado['nome'];
            $_SESSION['usuarioNiveisAcessoId'] = $resultado['niveis_acesso_id'];
            $_SESSION['usuarioEmail'] = $resultado['email'];
            if($_SESSION['usuarioNiveisAcessoId'] == "1"){
                header("Location: administrativo.php");
            }elseif($_SESSION['usuarioNiveisAcessoId'] == "2"){
                header("Location: colaborador.php");
            }else{
                header("Location: cliente.php");
            }
        //Não foi encontrado um usuario na tabela usuário com os mesmos dados digitado no formulário
        //redireciona o usuario para a página de login
        }else{    
            //Váriavel global recebendo a mensagem de erro
            $_SESSION['loginErro'] = "Usuário ou senha Inválido";
            header("Location: index.php");
        }
    //O campo usuário e senha não preenchido entra no else e redireciona o usuário para a página de login
    }else{
        $_SESSION['loginErro'] = "Usuário ou senha inválido";
        header("Location: index.php");
    }
?>

Primeiro inicializado a sessão, em seguida é incluído a conexão com a base de dados.

Em seguida verificado se o campo e-mail e senha está diferente de vazio, entra no if para validar o login, caso um dos campos esteja vazio ou ambos, entra no else, cria um variável global e insere a mensagem de erro e redireciona o usuário para a página de login.

Recebe os dados dos campos "email" e "senha", verifica SQL injection, converte a senha em md5.

Busca com o SELECT os dados na tabela usuário com o MySQLi, também utiliza o WHERE. Encontrando o usuário na tabela, acessa o if, caso contrario acessa o else.

Acessando o if, é criado as variáveis globais com os dados do usuário. Em seguida verificado o nível de acesso, é direcionado o usuário conforme seu nível de acesso.

Agora vamos conectar o PHP com o MySQLi. Vamos criar a página "conexao.php".

<?php
    $servidor = "localhost";
    $usuario = "root";
    $senha = "";
    $dbname = "funvildevendas";    
    //Criar a conexao
    $conn = mysqli_connect($servidor, $usuario, $senha, $dbname);
    
    if(!$conn){
        die("Falha na conexao: " . mysqli_connect_error());
    }else{
        //echo "Conexao realizada com sucesso";
    }      
?> 

Tabelas utilizadas para criar o sistema de login.


CREATE TABLE IF NOT EXISTS `usuarios` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(220) NOT NULL,
  `email` varchar(520) NOT NULL,
  `senha` varchar(50) NOT NULL,
  `situacoe_id` int(11) NOT NULL DEFAULT '0',
  `niveis_acesso_id` int(11) NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
)', NULL);

CREATE TABLE IF NOT EXISTS `niveis_acessos` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nome` varchar(50) NOT NULL,
  `created` datetime NOT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
)

Valores na tabelas.
Usuários:  A senha criptografada em MD5 é 123.

INSERT INTO `usuarios` (`id`, `nome`, `email`, `senha`, `situacoe_id`, `niveis_acesso_id`, `created`, `modified`) VALUES
(1, 'Cesar Szpak', 'cesar@celke.com.br', '202cb962ac59075b964b07152d234b70', 1, 1, '2016-02-14 00:00:01', '2016-02-20 21:58:01'),
(2, 'Kelly', 'kelly@celke.com.br', '202cb962ac59075b964b07152d234b70', 1, 2, '2016-02-14 00:00:04', '2016-02-20 21:58:12'),
(3, 'Jessica', 'jessica@celke.com.br', '202cb962ac59075b964b07152d234b70', 1, 3, '2016-02-14 00:00:03', '2016-02-20 21:58:25'),
(5, 'Marcia', 'marcia@celke.com.br', '831efa4c96023f4e602ebf86ca27a1d1', 1, 1, '2016-01-01 10:10:01', '2016-02-20 21:58:57');

Dados para a tabela nível de acesso:

INSERT INTO `niveis_acessos` (`id`, `nome`, `created`, `modified`) VALUES
(1, 'Administrador', '2016-02-19 00:00:00', NULL),
(2, 'Colaborador', '2016-02-19 00:00:00', NULL),
(3, 'Cliente', '2016-02-19 00:00:00', NULL);

Agora vamos criar a área do administrador, do colaborador e do cliente. Vamos criar as páginas "administrativo.php", "colaborador.php" e "cliente.php".

Nas três página será colocado o código abaixo.

Primeiro inicializado a sessão para usar as variáveis globais.

Em seguida será impresso o valor que está na variável global "$_SESSION['usuarioNome']".

E no final será criado o link para a página sair.

<?php
    session_start();
    echo "Usuario: ". $_SESSION['usuarioNome'];    
?>
<br>
<a href="sair.php">Sair</a>

Agora vamos implementar a página "sair.php", com o objetivo do usuário sair do sistema.

Primeiro inicializado a sessão para usar as variáveis globais.

Em seguida é apagado o conteúdo que está dentro das variáveis globais.

Depois será inserido a mensagem "Deslogado com sucesso" na variável $_SESSION['logindeslogado'], em seguida redirecionado o usuário para a página de login.

<?php
    session_start();   
    unset(
        $_SESSION['usuarioId'],
        $_SESSION['usuarioNome'],
        $_SESSION['usuarioNiveisAcessoId'],
        $_SESSION['usuarioEmail'],
        $_SESSION['usuarioSenha']
    );   
    $_SESSION['logindeslogado'] = "Deslogado com sucesso";
    //redirecionar o usuario para a página de login
    header("Location: index.php");
?>

Baixar o código fonte: Clique aqui