Pplware

PHP é à quinta-feira – Sistema de Login com sessões

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’];
?>

Uma vez que vamos ter de chamar a função session_start em todas as páginas, é melhor guardar o código num ficheiro chamado “init.php”, depois basta inclui-lo em todas as páginas, assim, se no futuro for necessário alterar alguma coisa não precisamos de alterar em todas elas, mas apenas no “init.php”.

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.


Download: autenticação.zip

Exit mobile version