2011-12-23 12 views
6

Ho un regolatore di disconnessione in CodeIgniter:Logout CodeIgniter

<?php 

class Logout extends MY_Controller { 

    function index() 
    { 

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

Questo mi si disconnette, ma quando chiamo un altro controllore, dopo la registrazione, come "/ site/addnewpost", questo mi accede di nuovo, come se la sesta non fosse stata distrutta in precedenza. Perché sta succedendo?

+0

rimuovere il reindirizzamento. crea un altro script che contenga solo 'var_dump ($ _ SESSION)' e chiama lo script dopo aver effettuato il logout per verificare se la sessione è effettivamente distrutta – xbonez

+0

qual è la tua parte di accesso? (in cui controlli la sessione) – ALH

+0

@xbonez - Correggimi se ho torto qui, ma ho pensato che CodeIgniter non usasse la sessione nativa di PHP. – Tyil

risposta

11

suggerimento di Seguire ALex, ma utilizzando il codice CI :). Cosa intendo, prova a disabilitare individualmente ciascun dato di sessione. Ho letto una volta di un problema nella versione 2.0.3, penso, ma non ricordo ora e non ho tempo per cercare il riferimento. È nel loro forum, però, e il suggerimento è stato lo stesso: disinserire ogni elemento della sessione uno per uno.

$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 

È necessità di reindirizzare perché la sessione di CI sono solo i cookies, non il nativo matrice sessione di php.

Un'altra cosa ... assicurarsi che l'errore non sia nei metodi di accesso, che consente di accedere non importa se si esegue correttamente il logout o no!

+0

WOrks ringrazia il tuo! –

2

Cercate eliminare in modo esplicito gli articoli come questo:

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

Il mio problema ha avuto a che fare con il caching sul lato server. Il più veloce ho potuto risolvere il problema era aggiungendo testo casuale al link di logout:

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

casa/logout conteneva lo stesso codice function index nella questione.

Solo così sai che il redirect('/', 'refresh') non ha funzionato per me, ma ho fatto di nuovo un rapido test.

Immagino che il metodo random_string() possa essere sostituito dall'emissione di intestazioni che costringono la cache a essere cancellata ecc. Come probabilmente avete indovinato, non posso farlo ora perché sono super impegnato. Forse più tardi.

1

Puoi anche provare manualmente a impostare il tuo "logged_in" o quello che hai chiamato la sessione su false. Quindi, distruggere tutti gli altri dati di sessione.

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

Per prima cosa dobbiamo caricare la libreria sessione a che fare con la sessione di disinserire il sessionID e distruggere la sessione. Sto usando questo codice per rimuovere la sessione e il logout sicuro.

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

Si prega di non pubblicare risposte solo in codice. Includi alcune spiegazioni su cosa hai cambiato, perché funziona, ecc. –