2011-12-23 13 views
6

Mam kontroler wylogowania w CodeIgniter:Wyloguj CodeIgniter

<?php 

class Logout extends MY_Controller { 

    function index() 
    { 

     $this->session->sess_destroy(); 
     redirect('index.php'); 
    } 
} 

ten loguje mi się, ale gdy zgłoszę innego kontrolera po zalogowaniu, na przykład „/ site/addnewpost”, to po prostu loguje mnie znowu, jak jeśli sasion nie został wcześniej zniszczony. Dlaczego to się dzieje?

+0

usunąć przekierowanie. utworzyć kolejny skrypt zawierający tylko 'var_dump ($ _ SESSION)' i wywołać ten skrypt po wylogowaniu, aby sprawdzić, czy sesja naprawdę jest zniszczona – xbonez

+0

jaka jest twoja część logowania? (w którym sprawdzasz sesję) – ALH

+0

@xbonez - Popraw mnie, jeśli się mylę, ale myślałem, że CodeIgniter nie używa macierzystej sesji PHP. – Tyil

Odpowiedz

11

Śledź Alex za propozycję, ale z użyciem kodu CI :). Co mam na myśli, spróbuj wyodrębnić poszczególne dane sesji indywidualnie. Czytałem kiedyś o problemie w wersji 2.0.3, ale teraz nie pamiętam i nie mam czasu na szukanie referencji. Jest jednak na ich forum, a sugestia była taka sama: odłączyć każdy element sesji jeden po drugim.

$this->session->unset_userdata('data_one'); 
$this->session->unset_userdata('data_two'); 
$this->session->unset_userdata('data_three'); 
$this->session->unset_userdata('data_one'); 
$this->session->sess_destroy(); 
redirect('home','refresh'); // <!-- note that 
//you should specify the controller(/method) name here 

Ty potrzeba przekierować ponieważ sesja USK są tylko ciasteczka, nie rodzimy array sesji php.

Kolejna sprawa ... upewnij się, że usterka nie występuje w Twoich metodach logowania, która rejestruje Cię bez względu na to, czy udało Ci się wylogować, czy nie!

+0

Dziękuję! –

2

Spróbuj jawnie usunąć elementy, takie jak ten:

$this->Session->delete('User'); 
$this->Session->destroy(); 
$this->Cookie->delete("User"); 
$this->Cookie->destroy(); 
$this->Auth->logout(); 
$this->redirect('whereever'); 
1

Mój problem polegał na buforowaniu po stronie serwera. Najszybszy mogę naprawić to było przez dołączenie losowy tekst do linku wylogowania:

<?php 
    $this->load->helper('string'); 
    echo anchor('/home/logout/'.random_string(), 'logout'); 
?> 

home/wylogowania zawierał ten sam kod jak function index w pytaniu.

Po prostu dlatego, że wiesz, że redirect('/', 'refresh') nie działa dla mnie, ale znowu zrobiłem szybki test.

Zgaduję, że metoda random_string() może zostać zastąpiona przez wyprowadzanie nagłówków, które wymuszają wyczyszczenie pamięci podręcznej itp. Jak już się pewnie domyśliliście, nie mogę tego teraz zrobić, ponieważ jestem bardzo zajęty. Może później.

1

Możesz też spróbować ręcznie ustawić wartość "logged_in" lub inną nazwę sesji na wartość false. Następnie niszcz wszystkie pozostałe dane sesji.

$this->session->set_userdata('logged_in', FALSE); 
    $this->session->session_destroy(); 
    redirect('index'); 
0

najpierw musimy załadować bibliotekę sesji do czynienia z sesji niż wyłączonym sessionid i zniszczyć sesji. Używam tego kodu, aby anulować sesję i zabezpieczyć się przed wylogowaniem.

$this->load->library('session'); 
$this->session->set_userdata('user_id', FALSE); 
$this->session->sess_destroy(); 
$this->load->view('your URL'); 
+0

Nie publikuj odpowiedzi tylko w formie kodu. Dodaj wyjaśnienie, co zmieniłeś, dlaczego działa, itp. –