Nos sistemas web que costumamos acessar hoje em dia é comum vermos controles de usuários. Um exemplo seria o de sistemas de publicações de artigos ou textos onde temos vários tipos de usuários como: Editor, Publicador, Revisor, etc, onde cada um possui privilégios diferentes de acesso às páginas do sistema ou site.

Neste artigo vamos abordar uma ideia básica de criação de controle de acesso com PHP e MySQL , onde teremos:

  • Tela de Login;
  • Tela de Cadastro de Usuário;
  • Funções que irão manipular os dados (cadastro no banco / verificação dos privilégios).

É um sistema simples, mas que pode ser tomado como base para a implementação de sistemas de controle bastante complexos com sessions, cookies, e assim por diante.

Mão na massa

O 1º passo é criarmos nossa index.php onde ficará nosso formulário de login e um link para efetivar um cadastro, caso não possua.

Listagem 1: Criando arquivo index.php


<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <div>
            Login
        </div>
        <form action="controle.php" method="post">
            <input type="text" name="login" value="" />
            <input type="password" name="senha" value="" />
            <input type="submit" name="enviar" value="Login"/>
            <a href="cadastrar.php">Sem cadastro?</a>
        </form>
    </body>
</html>
Formulário de login

Figura 1: Formulário de login

Após a criação deste arquivo vamos criar o formulário de cadastro de usuário, assim, quem não possuir login e senha poderá realizar um cadastro rápido.

Listagem 2: Criando o arquivo cadastrar.php


<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <div>
            Cadastro de usuário
        </div>
        <form action="controle.php" method="post">
            <label>Login</label>
            <input type="text" name="login" value="" /><br />
            <label>Senha</label>
            <input type="password" name="senha" value="" /><br />
            <label>Tipo de usuário</label>
            <select name="tipo_usuario">
                <option value="">Selecione</option>
                <option value="1">Usuario Comum</option>
                <option value="2">Administrador</option>
            </select><br />
            <input type="submit" name="cadastrar" value="cadastrar"/>
        </form>
    </body>
</html>
Formulário de cadastro de usuário PHP e MySQL

Figura 2: Formulário de cadastro de usuário

Com nossos formulários prontos, vamos prosseguir criando um controle para verificar se a requisição é de um cadastro novo ou se é de um login. Para tal, vamos criar o arquivo controler.php.

Listagem 3: Criando o arquivo controle.php


<?php
//utilização de namespaces
namespace controle;
include "processaAcesso.php";
use processaAcesso as processaAcesso;
$controle = new \processaAcesso\ProcessaAcesso;
if ($_POST["enviar"]) {
    $login = $_POST["login"];
    $senha = md5($_POST["senha"]);
    $usuario = $controle->verificaAcesso($login, $senha);
    //redirecionando para pagina conforme o tipo do usuário
    if ($usuario[0]["id_tipo_acesso"] == 1) {
        header("Location:paginas/pagina1.html");
    } else if ($usuario[0]["id_tipo_acesso"] == 2) {
        header("Location:paginas/pagina2.html");
    }
} else if ($_POST["cadastrar"]) {
    $login = $_POST["login"];
    $senha = md5($_POST["senha"]);
    $tipo_usuario = $_POST["tipo_usuario"];
    $arr = array("login_usuario" => $login, "senha_usuario" => $senha,
"id_tipo_acesso" => $tipo_usuario);
    if (!$controle->cadastraUsuario($arr)) {
        echo "Aconteceu algum erro";
    } else {
        $tipo_acesso = $controle->verificaAcesso($login, $senha);
        if ($tipo_acesso[0]["id_tipo_acesso"] == 1) {
            header("Location:paginas/pagina1.html");
        } else if ($tipo_acesso[0]["id_tipo_acesso"] == 2) {
            header("Location:paginas/pagina2.html");
        }
    }
}
?>

Agora já sabemos se é uma requisição de login ou é um cadastro de usuário recente.

Nosso próximo passo é criar outro controler para inserir novos usuários e para verificar qual o tipo de perfil que o usuário possui. Esse controler conversa diretamente com o controler criado anteriormente (controler.php).

Listagem 4: Criando o arquivo processaAcesso.php


<?php
//utilização de namespaces
namespace processaAcesso {
include "conexao/mysql.php";
    use Mysql as Mysql;
    class ProcessaAcesso {        
        var $db;
        public function __construct() {
            $conexao = new Mysql\mysql(DB_SERVER, DB_NAME, DB_USERNAME, DB_PASSWORD);
            $this->db = $conexao;
        }
        public function verificaAcesso($login, $senha) {            
            $select = $this->db->select("tb_usuario", "*",
" where login_usuario = "$login" and senha_usuario = "$senha"");
            return $select;
        }        
        public function cadastraUsuario($dados){            
            $insert = $this->db->insert("tb_usuario", $dados);
            return $insert;
        }
    }
}
?>

Para a lógica da nossa aplicação ficar completa, falta a comunicação com a base de dados correto? Então vamos criar um controle para podermos realizar o CRUD.

Listagem 5: Criando o arquivo mysql.php dentro da pasta conexão


<?php
//utilização de namespaces
namespace Mysql {
    //declaração de variáres globais
    define("DB_SERVER", "localhost");
    define("DB_NAME", "acesso");
    define("DB_USERNAME", "root");
    define("DB_PASSWORD", "");

    class mysql {
        var $db, $conn;
        public function __construct($server, $database, $username, $password) {
            $this->conn = mysql_connect($server, $username, $password);
            $this->db = mysql_select_db($database, $this->conn);
        }
        /**
         * Função de seleção dos registros da tabela
         * @param string $tabela tabela onde será buscado os registros
         * @param string $colunas string contendo as colunas separadas
por virgula para seleção, se null busca por todas *
         */
        public function select($tabela, $colunas = "*", $where = "1=1") {
            $sql = "SELECT $colunas FROM $tabela $where";
            $result = $this->executar($sql);
            while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
                $return[] = $row;
            }
            return $return;
        }

        /**
         * Função para inserir dados na tabela
         * @param array $dados Array contendo os dados a serem inseridos
         * @param string $tabela tabela que será inserido os dados
         * @return boolean verdadeiro ou falso
         */
        public function insert($tabela, $dados) {

            foreach ($dados as $key => $value) {
                $keys[] = $key;
                $insertvalues[] = "\"" . $value . "\"";
            }
            $keys = implode(",", $keys);
            $insertvalues = implode(",", $insertvalues);
            $sql = "INSERT INTO $tabela ($keys) VALUES ($insertvalues)";
            return $this->executar($sql);
        }
        private function executar($sql) {
            $return_result = mysql_query($sql, $this->conn);
            if ($return_result) {
                return $return_result;
            } else {
                $this->sql_error($sql);
            }
        }
        private function sql_error($sql) {
            echo mysql_error($this->conn) . "<br>";
            die("error: " . $sql);
        }
    }
}
?>

Pronto! Nossa lógica está toda montada. Para verificarmos a diferença dos acessos em relação ao tipo do usuário, vamos criar uma pasta chamada "Paginas" e dentro dela 2 arquivos, um para determinado tipo de usuário e outro para outro tipo.

Listagem 6: Criando o arquivo Pagina1.html


<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <div>Aqui, conteúdo para o login do tipo "Usuario comum"</div>
    </body>
</html> 

Listagem 7: Criando o arquivo Pagina2.html


<!DOCTYPE html>
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <div>Aqui, conteúdo para o login do tipo "Adminitrador"</div>
    </body>
</html>

O código deste artigo e o script do banco de dados utilizado estão em anexo para melhor aproveitamento. Lembre-se que este controle de usuário é simples, servindo apenas como base, podendo ser aplicadas a ele várias técnicas de controle como mencionado no início deste artigo.

Caso tenha dúvidas, criticas ou sugestões, não esqueça de deixar nos comentários. É sempre bom saber o que o leitor acha. Espero que tenham aproveitado e até o próximo artigo.

Aprenda mais sobre PHP