2010-10-21 12 views
22

in Codeigniter Sto costruendo un sistema di autenticazione per il mio sito web e per ottenere che uso biblioteca sessioneCome creare la casella di controllo "ricordami" usando la libreria di sessione Codeigniter?

 session->set_userdata('username') 

questo salverà la sessione -I ritengono affatto per qualche tempo

voglio fornire una casella "ricordami" nel modulo di login in modo che l'utente possa salvare la sessione per sempre - non è riuscito a trovare un modo per salvare la sessione per sempre !?

Nota: $ sess_expiration non funzionerà perché stabilisce la data di scadenza per tutti gli utenti e ciò che voglio fare è impostare la data di scadenza sulla base delle sue preferenze

è possibile? E come si fa?

Grazie

+0

È possibile utilizzare https://github.com/delight-im/PHP-Auth che ha questa funzione ed è * framework agnostic *. – caw

risposta

57

Se la casella di controllo Ricordami è selezionata, si imposta un cookie sul sistema dell'utente con una stringa casuale. Es .:

$cookie = array(
    'name' => 'remember_me_token', 
    'value' => 'Random string', 
    'expire' => '1209600', // Two weeks 
    'domain' => '.your_domain.com', 
    'path' => '/' 
); 

set_cookie($cookie); 

È inoltre salvare questa stringa casuale nella tabella users, per esempio nella colonna remember_me_token.

Ora, quando un utente (che non è ancora registrato) cerca di accedere a una pagina che richiede l'autenticazione:

  • si controlla se c'è un cookie con il nome di remember_me gettone suo sistema
  • se è lì, si controlla il database se esiste un record con lo stesso valore
  • in caso affermativo, si ricrea la sessione di questo utente (questo significa che vengono registrati in)
  • mostrano la pagina che state visitando

Se uno dei requisiti di cui sopra non è soddisfatta, vengono reindirizzati alla pagina di login.

Per motivi di sicurezza si consiglia di rinnovare la casuale remember_me_token ogni volta che l'utente accede. È inoltre possibile aggiornare la data di scadenza del cookie ogni volta che l'utente accede. In questo modo rimarrà loggato.

Sarebbe troppo lavoro scrivere tutto il codice per te, ma spero che questo ti aiuti a implementare questa funzionalità da solo. Si prega di commentare se avete domande. In bocca al lupo.

+0

Risposta molto bella e sicura. Kudos – seedg

+0

'expire' => 1209600 dovrebbe essere come 'expire' => time() + 1209600. – Namal

+3

@Priyanga, no non dovrebbe. Dalla [guida per l'utente] (http://ellislab.com/codeigniter/user-guide/libraries/input.html): "La scadenza è impostata in secondi, che verranno aggiunti all'ora corrente." – Mischa

0

È possibile impostare sess_expiration a 0 e quindi impostare una variabile personalizzata nella sessione come, remember_me = 1. Controlla questo valore e distruggi la sessione se necessario dopo un certo tempo. Questo sarebbe un workarround.

6

avevo bisogno la stessa cosa. Non si può raggiungere questo obiettivo utilizzando le impostazioni di CI così ho scelto di eseguire l'override del metodo setcookie della classe CI Session (in MY_Session):

function _set_cookie($cookie_data = NULL) 
{ 
    if (is_null($cookie_data)) 
    { 
     $cookie_data = $this->userdata; 
    } 

    // Serialize the userdata for the cookie 
    $cookie_data = $this->_serialize($cookie_data); 

    if ($this->sess_encrypt_cookie == TRUE) 
    { 
     $cookie_data = $this->CI->encrypt->encode($cookie_data); 
    } 
    else 
    { 
     // if encryption is not used, we provide an md5 hash to prevent userside tampering 
     $cookie_data = $cookie_data.md5($cookie_data.$this->encryption_key); 
    } 

    setcookie(
       $this->sess_cookie_name, 
       $cookie_data, 
       $this->userdata('rememberme') == true ? $this->sess_expiration + time() : 0, 
       $this->cookie_path, 
       $this->cookie_domain, 
       0 
      ); 

} 

Naturalmente è necessario impostare il flag RememberMe nella sessione in base alla scelta del fatto dall'utente.

+0

Anche qui di seguito: Se si stanno utilizzando le sessioni del database, non è possibile utilizzare questa soluzione, poiché il garbage collector utilizza il six_expiration per pulire la tabella delle sessioni. Quindi, un utente che non ha scelto "ricordami", causerà la cancellazione di tutte le sessioni scadute (dai suoi standard). –

1
$this->session->sess_expiration = '14400'; // expires in 4 hours 
$this->session->set_userdata($data);   // set session 
+1

Se si utilizza questo approccio, è necessario impostare 'sess_expiration' su ogni pagina di ricaricamento, altrimenti è necessario impostarlo esplicitamente ovunque si usi set_userdata() o anche set_flashdata(). Questo perché il cookie verrà sovrascritto con quello che hai impostato nella configurazione. –

+0

Se si stanno utilizzando sessioni di database, non è possibile utilizzare questa soluzione, poiché il garbage collector utilizza il metodo sess_expiration per pulire la tabella delle sessioni. Quindi, un utente che non ha scelto "ricordami", causerà la cancellazione di tutte le sessioni scadute (dai suoi standard). –

2

È possibile utilizzare isset per verificare se il cookie ha un valore e se il cookie viene eliminato, restituirà un valore negativo. Se è negativo, puoi impostare di nuovo il cookie ... ovviamente, questo sarà come "rinnovare" il cookie, quindi se l'utente non viene dalla scadenza, verrà dimenticato. (Impostare un grande tempo fino alla scadenza!)

Ad esempio:

<?php 
    if (isset($_COOKIE['autologin'])) { //Checks for cookie 
     echo "Welcome back!... Logging you in."; 
    }else{ //Sets a cookie 
     echo "Please sign in"; 
     $expiretime=time()+60*60*24*365; //set expire time to a year 
     setcookie("autologin", "What is here is not important.", $expiretime); 
    }; 
?> 
2

ho usato ganci per fare questo

  1. Abilita ganci in "config.php" impostazione $config['enable_hooks'] = TRUE;

  2. nel controller di accesso salvare il valore casella di controllo sulla sessione

    $this->session->set_userdata('remember_me', $this->input->post('remember_me')); 
    
  3. Nel vostro "hooks.php" file di aggiungere questo

    $hook['post_controller_constructor'] = array(
        'class'  => 'Change_Config', 
        'function' => 'change_session_expiration', 
        'filename' => 'change_config.php', 
        'filepath' => 'hooks' 
    ); 
    
  4. Nei tuoi "ganci" cartella creare un file chiamato "change_config.php" e incollare questo

    <?php 
    class Change_Config { 
        public function change_session_expiration() { 
         $ci = & get_instance(); 
    
         $remember = $ci->session->userdata('remember_me'); 
    
         if($remember && $ci->session->sess_expire_on_close) { 
          $new_expiration = (60*60*24*365); //A year milliseconds 
    
          $ci->config->set_item('sess_expiration', $new_expiration); 
          $ci->config->set_item('sess_expire_on_close', FALSE); 
    
          $ci->session->sess_expiration = $new_expiration; 
          $ci->session->sess_expire_on_close = FALSE; 
         } 
        } 
    } 
    
Problemi correlati