Por Pedro Peixoto para o PPLWARE
Em qualquer aplicação há necessidade de controlar o acesso dos utilizadores, de reservar algumas áreas apenas a administradores, de gerir quem pode ver o quê. Surge então a necessidade de implementar um sistema de autenticação e controlo de acessos. Vamos então aprender a fazer um simples sistema de logins.
Esta semana vamos continuar com os artigos simples, mas não tão curtos. Vamos alongar um pouco mais e aprender a fazer um simples sistema de autenticação e controlo de acessos. Obviamente, isto dava tema para uma tese, mas aqui vamos ser directos e objectivos.
Antes de começar a desenvolver o sistema propriamente dito vamos aqui cimentar alguns conhecimentos necessários:
Sessões
Seja mais simples, ou mais complexo um sistema de autenticação PHP recorre sempre às Sessões para o seu bom funcionamento.
As sessões permitem armazenar dados no servidor, não acessíveis ao utilizador, e que podem ser usados em diferentes páginas. Assim temos uma maneira simples e segura de guardar dados relativos a cada utilizador acessíveis em toda a aplicação.
Para usar as sessões do PHP temos que usar a seguinte função (em todas as páginas e antes de qualquer output):
<?php
session_start();
?>
A partir deste momento podemos usar o array $_SESSION para guardar qualquer informação. Assim o seguinte código permite gravar o meu nome na minha sessão:
<?php
session_start();
$_SESSION[‘NOME’]=’PEDRO’;
?>
Agora, se fizermos o output desta variável em qualquer página o meu nome lá permanecerá:
<?php
session_start();
echo $_SESSION[‘NOME’];
?>
As sessões são temporárias, duram apenas um tempo predefinido nas configurações do PHP (pode ser alterado), daí as sessões expirarem. No entanto há também a necessidade de terminar uma sessão num determinado momento, principalmente quando elas guardam informação do utilizador e ele não quer que fique acessível a outro utilizador que possa usar o computador a seguir. Para terminar a sessão usamos a função “session_destroy()”. Claro que para fazer o “session_destroy” é necessário que previamente na página haja o “session_start”. Vamos então criar uma página “logout.php” que termine a sessão:
<?php
include 'init.php';
session_destroy();
header("location: index.php");
?>
Usámos o ficheiro “init.php” que já tínhamos criado. De notar que na última linha redirecionamos o utilizador para a página “index.php” que é a página inicial de uma aplicação PHP.
POST:
O POST, de uma maneira fácil de entender, é um vector (tal como o $_SESSION) que nos permite aceder a dados enviados através de formulários HTML que usam este método. Para enviar dados de um formulário HTML para esta variável teremos que colocar o seguinte código HTML:
<html>
<body>
<form name="login" method="post" action="login.php">
</form>
</body>
</html>
Desta maneira os dados dos campos do formulário (no exemplo não tem qualquer campo) serão enviados por POST para a página “login.php”.
Assim se pretendêssemos ler um username e uma password o código HTML seria:
<html>
<head>
<title>Login</title>
</head>
<body>
<h2>Login</h2>
<form name="login" method="post" action="login.php"> Email:<br/>
<input name="email" type="text" maxlength="40"/></br>
Password:</br>
<input name="password" type="password" maxlength="20"/></br> <input type="submit" value="Login" />
</form>
</body>
</html>
Vamos gravar esta página com o nome “index.php”.
Como já tínhamos visto os dados serão enviados por POST para a página “login.php”, então para testar temos de criar esta página:
<?php
include 'init.php';
echo $_POST['email'];
?>
Podemos agora testar:
E resultado depois de submeter:
Poderíamos fazer a validação com a password no próprio código mas como no último artigo já aprendemos a trabalhar com MySQL vamos então usar esses conhecimento para criar uma micro base de dados:
É recomendável que se usem passwords encriptadas, normalmente em MD5, mas vamos simplificar e criar algo simples. Um campo de Email e uma Password permitirão gerir os utilizadores do sistema. Vamos desde já adicionar um utilizador fictício:
Agora que já temos uma base de dados, vamos escrever o código que permita a ligação e consulta da mesma. Uma vez que já temos o ficheiro “init.php” poderemos colocar o código de conexão com o MySQL no mesmo, passando o ficheiro a ter a seguinte forma:
<?php
session_start();
mysql_connect('localhost','root','root');
mysql_select_db('pplware');
?>
Agora vamos modificar o ficheiro “login.php” para poder consultar a base de dados e em caso de sucesso colocar o email em sessão:
<?php
include 'init.php';
//CONSULTA DO UTILIZADOR
$consulta="Select * from utilizadores where email='" . $_POST['email'] . "' and password='" . $_POST['password'] . "'";
$resultado=mysql_query($consulta);
if (mysql_num_rows($resultado)>0) //SE O EMAIL E A PASSWORD COINCIDIREM
{
//COLOCA NA VARIAVEL LINHA OS DADOS DA CONSULTA
$linha=mysql_fetch_array($resultado);
//COLOCA O EMAIL EM SESSAO
$_SESSION['EMAIL']=$linha['EMAIL'];
//REDIRECCIONA A PAGINA PARA A PAGINA SECRETA
header("location: admin.php");
}
else //CASO NÃO COINCIDAM
{
//REDIRECCIONA PARA A PAGINA INICIAL REPORTANDO O ERRO
header("location: index.php?erro=1");
}
?>
Como podemos observar, primeiro fazemos uma consulta onde pedimos todos os registos que tenham o username e a password introduzidas, depois de contar o número de registos devolvidos, se existir algum registo significa que na base de dados existe a correspondência USERNAME<->PASSWORD introduzidas, guardamos o EMAIL em sessão e de seguida redireccionamos para a página de administração. Caso não existam registos que correspondam às credenciais introduzidas vamos direccionar para a página inicial com o parâmetro “erro” igual a 1. Vamos por isso configurar a página inicial e adaptá-la aos novos desenvolvimentos:
<?php
include "init.php";
?>
<html>
<head>
<title>Login</title>
</head>
<body>
<?php
if(isset($_GET['erro'])) //SE EXISTIR ERRO
echo 'Erro no login. Tente novamente.';
?>
<h2>Login</h2>
<form name="login" method="post" action="login.php">
Email:<br/>
<input name="email" type="text" maxlength="40"/></br>
Password:</br>
<input name="password" type="password" maxlength="20"/></br>
<input type="submit" value="Login" />
</form>
</body>
</html>
Assim, caso o parâmetro “erro” seja igual a 1 a página emite o erro ‘Erro no login. Tente novamente.’.
Falta, agora controlar o acesso em páginas reservadas. Para exemplificar vamos criar uma página “admin.php” apenas acessível a utilizadores autenticados:
<?php
include "init.php";
?>
<html>
<head>
<title>Área reservada</title>
</head>
<body>
<?php
if (isset($_SESSION['EMAIL'])) //SE EXISTIR AUTENTICAÇÃO
{
echo ' Olá ' . $_SESSION['EMAIL'] . '.<br/>';
//--------------------------//
//TODO O CODIGO PRIVADO AQUI//
//--------------------------//
echo '<a href="logout.php"> Logout</a></td>';
//LINK PARA FAZER LOGOUT
}
else //CASO NÃO ESTEJA AUTENTICADO
{
echo 'Esta é uma área reservada, só utilizadores podem ter acesso.';
}
?>
</body>
</html>
O código é simples, verificamos se a variável de sessão está a ser “usada” para decidir se é um utilizador autenticado ou não. Aproveitamos para deixar o link para a página de logout que já tínhamos criado num passo anterior.
No fundo este é o tipo de controlo que podemos usar em PHP, neste caso estamos a fazer um controlo simples onde apenas verificamos se é um utilizador autenticado ou não, mas poderíamos até ter colocado uma variável em sessão que dizia se o utilizador tinha permissões nível 1,2, ou 3 e nas páginas verificávamos se o nível era o exigido para a poder visualizar.
E está pronto o nosso sistema de login, resta experimentar e comprovar que tudo está a funcionar como deveria. Não é nada de muito avançado , mas tem as bases para desenvolverem o vosso próprio sistema.