8
respostas

Login não desloga nem reiniciando o navegador

Amigos, terminei o curso e ao finalizar a edição de todo o código, que está funcionando corretamente, o usuário não "desloga" nem quando reinicia o navegador... Alguma ideia do porquê? Como posso fazer para que além de deslogar ao sair, ele deconecte depois de um determinado tempo logado?

8 respostas

Fabrizio, posta pra gente o código com a lógica dos cookies pra podermos ver o que está acontecendo

Segue a lógica do login do usuário, que está codificado por "SESSION":

<?php
session_start();

function usuarioEstaLogado() {
    return isset($_SESSION["usuario_logado"]);
}

function verificaUsuario() {
  if(!usuarioEstaLogado()) {
      $_SESSION["danger"] = "Você não tem acesso a esta funcionalidade.";
     header("Location: index.php");
     die();
  }
}

function usuarioLogado() {
    return $_SESSION["usuario_logado"];
}

function logaUsuario($usuario) {
    $_SESSION["usuario_logado"] = $usuario;
}

function logout() {
    session_destroy();
    session_start();
}

Oi Fabrizio, tudo bom?

Na verdade, reiniciar o navegador não é suficiente. Quando fazemos:

$_SESSION["usuario_logado"] = $usuario;

Guardamos os dados do usuario no servidor e enviamos para os cookies do navegador o SESSION_ID. Fechar o navegador não faz com que os cookies do navegador sejam limpos. Se você quiser invalidar o login, você precisa limpar os cookies do seu navegador =)

Abraço!

Ok. Mas, tem como limpar os cookies no navegador pelo código php? Como seria?

Para remover um cookie do navegador do usuario basta utilizar a função unset na chave do array __Cookies:

    unset($_COOKIE['suaChave']);

Entretanto, se você estiver tratando isso no back-end da aplicação o ideal é remover os dados desse usuario da sessão mesmo. Removendo os dados do usuario da sessão deslogamos ele da mesma forma =)

Eu estava com o mesmo problema, tentei todas as maneiras e não deu certo. O que fiz foi utilizar a lógica dentro da lógica como ensinado no vídeo.

function logaUsuario($email){
        $_SESSION['usuario_logado'] = $email; //funçao para logar o usuário 
    }
  function logout(){
        session_destroy(logaUsuario($email)); //a função logout vai destruir a função logaUsuario por completo.
    }

Oi Rafael, obrigado pela sugestão, mas eu fiz como você falou e ainda não resolveu...

Olá Rafael! Meu amigo, pode ser que esteja ocorrendo alguma má interpretação. Se me lembro bem, quando o instrutor usa a função : usuarioLogado(); Ele está querendo saber se o usuário já se encontra Logado. Se assim for a sua função tem q Retornar um Isset dessa mesma SESSION. Pelo oq eu estou vendo, vc ao usar a função: usuarioLogado(); vc está na vdd criando uma SESSION vazia com o nome: "usuario_logado".

Verifica depois pra gente se realmente há necessidade dessa função. Não sei bem ao certo, mas tenta ver se o problema é essa função que cria uma SESSION vazia.

Fiquei curioso, pq vc colocou um session_start Logo depois de vc destruir todas. Há realmente a necessidade disso? Ao fazer os teste em meu pc, funcionou sem o session_start na função logout();

E tenta vê se não seria melhor se o arquivo estivesse formatado dessa forma:

<?php
session_start();
function logaUsuario($usuario) {
    $_SESSION["usuario_logado"] = $usuario;
}

function usuarioEstaLogado() {
    return isset($_SESSION["usuario_logado"]);
}

function verificaUsuario() {
  if(!usuarioEstaLogado()) {
      $_SESSION["danger"] = "Você não tem acesso a esta funcionalidade.";
     header("Location: index.php");
     die();
  }
}


function logout() {
    session_destroy();
}

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software