Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

GraCasBa

Destruir Sessão

Recommended Posts

Como faço para encerrar uma sessao, preciso destruir uma sessao, quando clico em sair ele passa pela função sair vai para a pagina de login ate ai tudo bem, mas se eu digitar na url o endereço de qualquer pagina do programa ele vai sem precisar logar, ja tentei de tudo e não destroi a sessao, alguem pode me ajudar fazendo favor. Desde ja obrigada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Como faço para encerrar uma sessao, preciso destruir uma sessao, quando clico em sair ele passa pela função sair vai para a pagina de login ate ai tudo bem, mas se eu digitar na url o endereço de qualquer pagina do programa ele vai sem precisar logar, ja tentei de tudo e não destroi a sessao, alguem pode me ajudar fazendo favor. Desde ja obrigada.

 

Para destruir a sessão basta você utilizar a função session_destroy() do PHP.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Flavio é assim

 

Depois que faz o login tem duas opções, cadastrar usuario e sair

echo "| <a href='?acao=inserir'>Inserir Usuario</a>";

echo "| <a href=\"formlogin.php?acao=sair\">Sair</a>|</li><br></br><br></br>";

 

Tem uma parte no formlogim assim:

if ($_GET['acao'] == "sair") {

 

// Desautentica o usuário, destruindo a sessão e redirecionando o usuário

// para a página de login

 

$this->sair();

 

}

 

echo "<h1>Autenticacao do Usuario</h1>";

 

A função é essa

 

private function sair() {

 

//se sair destruir a sessao

// Unset all of the session variables.

$_SESSION = array();

// If it's desired to kill the session, also delete the session cookie.

// Note: This will destroy the session, and not just the session data!

if (isset($_COOKIE[session_name()])) {

//setcookie(session_name(), '', time()-42000, '/');

unset($_COOKIE[session_name()]);

}

// Finally, destroy the session.

session_unset();

 

session_destroy();

parent::printMensagemSucesso("Saída do sistema realizada com sucesso.");

}

 

Ja tentei essa tbm,

tentei criar um arquivo chamado logout

session_start();

unset($_SESSION['id']);

unset($_SESSION['nome']);

unset($_SESSION['login']);

header("Location: formlogin.php");

 

Já tentei de tudo eu acho e não da certo.

 

Obrigada por ta me ajudando :grin:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem-se que prestar atencao no trecho de codigo onde a chamada para $this->sair() e feita.

 

A qual objeto ela se refere ? Trata-se de um metodo privado, logo nao pode ser acessado de fora da classe.

 

Poste mais detalhes da implementacao.

Compartilhar este post


Link para o post
Compartilhar em outros sites

mesmo para remover a sessão é necessário inciá-la antes:

 

Certifique-se, também, de remover o cookie identificador de sessão

 

session_destroy() destrói todos os dados associados com a sessão atual. Ela não desregistra nenhuma das variáveis globais associadas a sessão atual, nem desregistra o cookie de sessão.

 

Para poder matar a sessão junto, como para fazer o log out do usuário, o id da sessão também deve ser desregistrado. Se for usado um cookie para propagar o id de sessão (funcionamento padrão), então o cookie de sessão deve ser excluído. setcookie() pode ser usado para isso.

 

Visto isso, o mínimo de linhas necessárias para remover uma sessão com segurança seguem abaixo:

 

// inicia o manipulador de sessão
session_start();

// recupera o nome do identificador de sessão
$cookie_name = session_name();

// elimina todas as informações relacionadas à sessão atual
session_destroy();

// encerra o manipulador de sessão
session_write_close();

// limpa o cookie identificador de sessão
setcookie($cookie_name, '', time());

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tem-se que prestar atencao no trecho de codigo onde a chamada para $this->sair() e feita.

 

A qual objeto ela se refere ? Trata-se de um metodo privado, logo nao pode ser acessado de fora da classe.

 

Poste mais detalhes da implementacao.

 

 

Oi

Estava private ai mudei para public e ainda não deu certo

 

esse $this->sair() fica na mesma classe que a função public function sair.

 

Obrigada por esta me ajudando

 

mesmo para remover a sessão é necessário inciá-la antes:

 

Certifique-se, também, de remover o cookie identificador de sessão

 

 

 

Visto isso, o mínimo de linhas necessárias para remover uma sessão com segurança seguem abaixo:

 

// inicia o manipulador de sessão
session_start();

// recupera o nome do identificador de sessão
$cookie_name = session_name();

// elimina todas as informações relacionadas à sessão atual
session_destroy();

// encerra o manipulador de sessão
session_write_close();

// limpa o cookie identificador de sessão
setcookie($cookie_name, '', time());

 

 

 

Oi,

Coloquei esse codigo que você me passou e não adiantou :upset:

 

Obrigada por ta me ajudando

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, vamos la. Poste o codigo desta classe inteira para tentarmos identificar o problema. Acredito que alguma chamada equivocada de metodo esteja influenciando.

 

 

 

Oi ArentesProg então vou tenta explica como é meu programa ele tem varias classes entre elas uma classe formlogin para fazer a parte de login so entra pessoas autorizadas e a outra classe usuario onde as pessoas autorizadas possa cadastra mais pessoas, na classe usuario pussui um campo para cadastra usuarios e sair assim: echo "| <a href='?acao=inserir'>Inserir Usuario</a>";

echo "| <a href=\"formlogin.php?acao=sair\">Sair</a>|</li><br></br><br></br>";

na classe formlogin possui uma parte assim:... if ($_GET['acao'] == "sair") {

 

// Desautentica o usuário, destruindo a sessão e redirecionando o usuário

// para a página de login

 

$this->sair();

 

}

 

echo "<h1>Autenticacao do Usuario</h1>";

 

na mesma classe formlogin tem a função sair assim: public function sair() {

 

//se sair destruir a sessao

// Unset all of the session variables.

$_SESSION = array();

// If it's desired to kill the session, also delete the session cookie.

// Note: This will destroy the session, and not just the session data!

if (isset($_COOKIE[session_name()])) {

//setcookie(session_name(), '', time()-42000, '/');

unset($_COOKIE[session_name()]);

}

// Finally, destroy the session.

session_unset();

 

session_destroy();

parent::printMensagemSucesso("Saída do sistema realizada com sucesso.");}

a função tava private coloquei public e nao adiantou coloquei tbm como o Evandro falo tbm não adiantou não sei mais oq fazer.

 

Não sei se deu para entender, senao me fala que tento esclarecer melhor

Obrigada por ta me ajudando

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja que a linha que remove o cookie está comentada

 

if (isset($_COOKIE[session_name()])) {
//setcookie(session_name(), '', time()-42000, '/');  <<<<<
unset($_COOKIE[session_name()]);
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entao cara, eh o seguinte. O problema eh em que parte esta esse trecho que você checa a action e usa o metodo de realizar o logoff:

 

 if ($_GET['acao'] == "sair") {

// Desautentica o usuário, destruindo a sessão e redirecionando o usuário
// para a página de login

$this->sair();

}

 

Porque eu digo isso ? Porque todo o codigo dentro de uma classe nao estatica ou nao abstrata necessita de uma instancia da mesma para que o codigo dentro dela seja acessado. Logo, esse "if" nunca seria atingido soh pelo fato de voce redirecionar o usuario para a pagina que contem a classe. Voce precisa que uma instancia da classe faca o "parser" da sua requisicao get e, se encontrada a action apropriada, chame a operacao de realizar logoff. Precisamos saber onde esta este trecho de codigo especificamente. Eu sugeriria algo como o seguinte codigo:

 

formLogin.php

$formLogin = new FormLogin($_GET);
class FormLogin {
   public function __construct($request) {
       if ($request['acao'] === 'sair') {
           $this->sair();
       }
   }
}

 

Claro que essa eh uma solucao bem simples e voltada ao seu problema especifico, decorrente do codigo ja criado. O mais correto seria pesquisar sobre MVC cara, para separar corretamente a camada de apresentacao da camada de controle da aplicacao (requests e responses).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Veja que a linha que remove o cookie está comentada

 

if (isset($_COOKIE[session_name()])) {
//setcookie(session_name(), '', time()-42000, '/');  <<<<<
unset($_COOKIE[session_name()]);
}

 

 

Oi Evandro descomentei não adiantou, o problema continua

 

 

Obrigada por ta me ajudando

 

Entao cara, eh o seguinte. O problema eh em que parte esta esse trecho que você checa a action e usa o metodo de realizar o logoff:

 

 if ($_GET['acao'] == "sair") {

// Desautentica o usuário, destruindo a sessão e redirecionando o usuário
// para a página de login

$this->sair();

}

 

Porque eu digo isso ? Porque todo o codigo dentro de uma classe nao estatica ou nao abstrata necessita de uma instancia da mesma para que o codigo dentro dela seja acessado. Logo, esse "if" nunca seria atingido soh pelo fato de voce redirecionar o usuario para a pagina que contem a classe. Voce precisa que uma instancia da classe faca o "parser" da sua requisicao get e, se encontrada a action apropriada, chame a operacao de realizar logoff. Precisamos saber onde esta este trecho de codigo especificamente. Eu sugeriria algo como o seguinte codigo:

 

formLogin.php

$formLogin = new FormLogin($_GET);
class FormLogin {
   public function __construct($request) {
       if ($request['acao'] === 'sair') {
           $this->sair();
       }
   }
}

 

Claro que essa eh uma solucao bem simples e voltada ao seu problema especifico, decorrente do codigo ja criado. O mais correto seria pesquisar sobre MVC cara, para separar corretamente a camada de apresentacao da camada de controle da aplicacao (requests e responses).

 

 

Oi ArantesProg vou ler direitinho o que você me passaou e logo darei a resposta

Obrigada por ta me ajudando

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oi Evandro descomentei não adiantou, o problema continua

 

 

Obrigada por ta me ajudando

 

 

 

 

Oi ArantesProg vou ler direitinho o que você me passaou e logo darei a resposta

Obrigada por ta me ajudando

 

 

 

Oi ArantesProg fiz como você me falo ainda não deu certo, ele esta lendo essa aprte do codigo pq quando aperto o botão sair ele sai mostra a mensagem tudo direitinho, mas quando digito na url ele vai para a pagina digitada sem pedir o login, então isso quer dizer q a sessao não esta sendo destruida ne?! Não sei mais oq fazer.

Obrigada por esta me ajudando

Compartilhar este post


Link para o post
Compartilhar em outros sites

Oiii pessoal que me ajudaram, consegui resolve o problema não estava verificando se a sessao estava aberta, ou seja, não estava verificando se estava logado, agora antes de entrar na classe crudusuario, é verificado se o campo login foi escrito algo se tiver vazio quer dizer que a pessoal não fez o login:classe crudusuario(um pedaço do codigo) olhe bem o if

.........

if ((!isset($_SESSION['login']))) {//essa checagem é fundamental sem ela não verifica se a pessoa logo ou não

//redireciona para a tela de login, pois as variáveis de sessão não estão preenchidas

 

echo "<script language='JavaScript'>\n";

echo "<!--\n";

echo " self.document.location.href='formlogin.php'\n";

echo "//-->\n";

echo "</script>\n";

exit;

} else {

echo "<h4>Olá,<b>" . $_SESSION['login'] . "</b>!</h4>";

echo "| <a href='?acao=inserir'>Inserir Usuario</a>";

echo "| <a href=\"formlogin.php?acao=sair\">Sair</a>|</li><br></br><br></br>";

..........

esse if tbm deve ser feito na classe formlogin, antes de direcional para o crudusuario

classe formlogin

.....

if($resultado && $validar){

 

 

$_SESSION['login'] = $this->usuario;

 

 

if ((!isset($_SESSION['login']))) {//esse if aqui tem q ter

//redireciona para a tela de login, pois as variáveis de sessão não estão preenchidas

//header("Location: http://".$_SERVER['HTTP_HOST'].dirname($SERVER['PHP_SELF'])."/inicial.php");

echo "<script language='JavaScript'>\n";

echo "<!--\n";

 

echo " self.document.location.href='formlogin.php'\n";

 

echo "//-->\n";

echo "</script>\n";

exit;

}

else echo "<meta HTTP-EQUIV='Refresh' CONTENT='0;URL=crudusuario.php'>";

$sucesso = true;

}elseif($resultado && !$validar){

$_SESSION['erro'] = "Usuario não permitido ao acesso!";

}

 

else {

$sucesso = false;

$_SESSION['erro'] = " Falha na autenticacao! Usuario não cadastrado!";

 

}

 

// if ($sucesso){

// $_SESSION['erro'] = ' ';

// }

 

 

} catch (Exception $e) {

 

$this->adicionarMsgValidacao($e->getMessage());

return $sucesso;

}

 

}

Obrigada a todos que tentaram me ajuda :grin:

 

Entao cara, eh o seguinte. O problema eh em que parte esta esse trecho que você checa a action e usa o metodo de realizar o logoff:

 

 if ($_GET['acao'] == "sair") {

// Desautentica o usuário, destruindo a sessão e redirecionando o usuário
// para a página de login

$this->sair();

}

 

Porque eu digo isso ? Porque todo o codigo dentro de uma classe nao estatica ou nao abstrata necessita de uma instancia da mesma para que o codigo dentro dela seja acessado. Logo, esse "if" nunca seria atingido soh pelo fato de voce redirecionar o usuario para a pagina que contem a classe. Voce precisa que uma instancia da classe faca o "parser" da sua requisicao get e, se encontrada a action apropriada, chame a operacao de realizar logoff. Precisamos saber onde esta este trecho de codigo especificamente. Eu sugeriria algo como o seguinte codigo:

 

formLogin.php

$formLogin = new FormLogin($_GET);
class FormLogin {
   public function __construct($request) {
       if ($request['acao'] === 'sair') {
           $this->sair();
       }
   }
}

 

Claro que essa eh uma solucao bem simples e voltada ao seu problema especifico, decorrente do codigo ja criado. O mais correto seria pesquisar sobre MVC cara, para separar corretamente a camada de apresentacao da camada de controle da aplicacao (requests e responses).

 

 

Oi ArantesProg da uma olhada no post a cima eu consegui resolver. Era uma coisa boba, mas de fundamental importância. Obrigada

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.