Criando controle de acesso com PHP e MySQL

Veja neste artigo uma forma de implementar o controle de acesso por usuário a um sistema desenvolvido com PHP e MySQL.

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:

É 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>

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>

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

Artigos relacionados