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