Sistema de login – Parte 3 – PHP OOP

Opa opa opa! Vamos continuar hoje com a terceira parte do nosso tutorial de “Criando um sistema de logins com classe no PHP”…

Já passamos vitoriosos pela Parte 2 e hoje vamos fazer o método que usaremos para verificar se um usuário está logado e o método que usaremos para deslogar o usuário… A boa notícia é que depois da aula de hoje a classe estará pronta para vocês usarem em vossos sites, lembrando sempre que o importante aqui é que vocês aprendam como fazer e não apenas copiem o código e usem.

Vamos começar fazendo uma correção que o Leo Baiano sugeriu no método validaUsuario() criado na Parte 1… A mudança vai acontecer entre a linha 87 e a linha 96:
<?php
// Procura por usuários com o mesmo usuário e senha
$sql = “SELECT COUNT(*)
FROM `{$this->bancoDeDados}`.`{$this->tabelaUsuarios}`
WHERE
`{$this->campos[‘usuario’]}` = ‘{$usuario}’
AND
`{$this->campos[‘senha’]}` = ‘{$senha}'”;
$query = mysql_query($sql);
if ($query) {
$total = mysql_result($query, 0);

Mudaremos a consulta e outras três linhas depois:
<?php
// Procura por usuários com o mesmo usuário e senha
$sql = “SELECT COUNT(*) AS total
FROM `{$this->bancoDeDados}`.`{$this->tabelaUsuarios}`
WHERE
`{$this->campos[‘usuario’]}` = ‘{$usuario}’
AND
`{$this->campos[‘senha’]}` = ‘{$senha}'”;
$query = mysql_query($sql);
if ($query) {
$total = mysql_result($query, 0, ‘total’);
// Limpa a consulta da memória
mysql_free_result($query);

Essa mudança foi necessária por causa de um probleminha com a função mysql_result() que tem dificuldades de identificar qual resultado nós queremos… Com esse ajuste tudo irá funcionar perfeitamente.

Agora nós iremos começar a criar o método que verifica se há um usuário logado… Ele irá retornar TRUE quando um usuário estiver logado e retornará FALSE em qualquer situação que indique que não há um usuário logado, por isso precisamos verificar todas as possibilidades:
<?php
/**
* Verifica se há um usuário logado no sistema
*
* @return boolean – Se há um usuário logado ou não
*/
function usuarioLogado() {
// Continuaremos aqui…
}

Primeiro nós verificamos a necessidade de iniciar a sessão e lógo após isso iremos verificar se existe o valor “logado” na sessão:
<?php
// Inicia a sessão?
if ($this->iniciaSessao AND !isset($_SESSION)) {
session_start();
}
// Verifica se não existe o valor na sessão
if (!isset($_SESSION[$this->prefixoChaves . ‘logado’]) OR !$_SESSION[$this->prefixoChaves . ‘logado’]) {
return false;
}

Pra quem não lembra, esse valor $this->prefixoChaves . ‘logado’ foi criado pelo método logaUsuario().

Agora nós precisamos verificar (caso seja necessário) o cookie que contém as informações (usuário, IP e navegador) do usuário para ver se elas batem com o que está armazenado no cookie:
<?php
// Faz a verificação do cookie?
if ($this->cookie) {
// Verifica se o cookie não existe
if (!isset($_COOKIE[$this->prefixoChaves . ‘token’])) {
return false;
} else {
// Continuaremos aqui…
}
}

Caso haja o cookie, precisamos criar novamente uma string encriptada contendo as informações do usuário para checar com o valor salvo no cookie:
<?php
// Monta o valor do cookie
$valor = join(‘#’, array($_SESSION[$this->prefixoChaves . ‘usuario’], $_SERVER[‘REMOTE_ADDR’], $_SERVER[‘HTTP_USER_AGENT’]));
// Encripta o valor do cookie
$valor = sha1($valor);
// Verifica o valor do cookie
if ($_COOKIE[$this->prefixoChaves . ‘token’] !== $valor) {
return false;
}

Feita a verificação do cookie sabemos que, depois disso tudo, o usuário está logado e podemos retornar true e fechar o método..
<?php
// A sessão e o cookie foram verificados, há um usuário logado
return true;

Terminamos o método que informa se há um usuário logado, agora vamos começar o método que fará o logout do usuário:
<?php
/**
* Faz logout do usuário logado
*
* @return boolean
*/
function logout() {
// Continuaremos aqui…
}

O primeiro passo do logout é iniciar a sessão e remover todos os valores da sessão…
<?php
// Inicia a sessão?
if ($this->iniciaSessao AND !isset($_SESSION)) {
session_start();
}
// Tamanho do prefixo
$tamanho = strlen($this->prefixoChaves);
// Destroi todos os valores da sessão relativos ao sistema de login
foreach ($_SESSION AS $chave=>$valor) {
// Remove apenas valores cujas chaves comecem com o prefixo correto
if (substr($chave, 0, $tamanho) == $this->prefixoChaves) {
unset($_SESSION[$chave]);
}
}

Repare que entre a linha 236 e 242 fizemos uma coisa interessante: removemos da sessão apenas os valores que pertencerem ao nosso sistema de login… Muita gente usa um simples session_destroy() para acabar com a sessão, mas se o seu site salvar valores na sessão não podemos simplesmente apagá-los, concorda? 🙂

Por isso nós fazemos uma verificação a mais, que checa se ainda existem valores na sessão e [caso não exista nada] usamos o session_destroy() e depois removemos o cookie que identifica qual sessão é de qual visitante:
<?php
// Destrói asessão se ela estiver vazia
if (count($_SESSION) == 0) {
session_destroy();
// Remove o cookie da sessão se ele existir
if (isset($_COOKIE[‘PHPSESSID’])) {
setcookie(‘PHPSESSID’, false, (time() – 3600));
unset($_COOKIE[‘PHPSESSID’]);
}
}

Agora o último passo do logout é remover o cookie que armazena as informações do visitante:
<?php
// Remove o cookie com as informações do visitante
if ($this->cookie AND isset($_COOKIE[$this->prefixoChaves . ‘token’])) {
setcookie($this->prefixoChaves . ‘token’, false, (time() – 3600), ‘/’);
unset($_COOKIE[$this->prefixoChaves . ‘token’]);
}

Terminando o método poremos retornar o valor booleano (true ou false) que informa se o usuário foi deslogado com sucesso… Existe forma melhor de fazer isso do que verificando se não há um usuário logado?
<?php
// Retorna SE não há um usuário logado
return !$this->usuarioLogado();

Não deixem de dar uma olhada nas outras partes:

Sistema de login – Parte 1 – PHP OOP
Sistema de login – Parte 2 – PHP OOP

Espero realmente que tenham gostado e aprendido com essa sequencia de tutoriais.

Quem gostou levanta a mão! \o. (E com a outra mão, deixa um comentário construtivo é claro)

Abraços e até a próxima!

Deixe uma resposta