2010-10-21 29 views
22

en CodeIgniter Estoy construyendo un sistema de autenticación para mi sitio web y para lograr que utilizo biblioteca sesiónCómo crear la casilla de verificación "recordarme" mediante la biblioteca de sesión de Codeigniter?

 session->set_userdata('username') 

esto ahorrará la sesión -I Crea la hace algún tiempo

quiero proporcionar una "recuérdame" casilla de verificación en el formulario de inicio de sesión para que el usuario pueda guardar la sesión para siempre, ¿no pudo encontrar la manera de guardar la sesión para siempre?

Nota: $ sess_expiration no funcionará, ya que establece la fecha de caducidad para todos los usuarios y lo que yo quiero hacer es fijar la fecha de caducidad en base a sus preferencias

es posible? ¿Y, cómo hacerlo?

Gracias

+0

es posible utilizar https://github.com/delight-im/PHP-Auth que tiene esta característica y es * * marco agnóstico. – caw

Respuesta

57

Si la casilla de verificación recordarme está marcada, configura una cookie en el sistema del usuario con una cadena aleatoria. Ej .:

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

set_cookie($cookie); 

También guarda esta cadena aleatoria en la tabla users, por ejemplo, en la columna remember_me_token.

Ahora, cuando un usuario (que aún no ha iniciado la sesión) intenta acceder a una página que requiere autenticación:

  • comprobar si existe una cookie con el nombre de remember_me ficha en su sistema de
  • si está allí, se comprueba la base de datos si existe un registro con el mismo valor
  • si es así, volver a crear la sesión de este usuario (esto significa que se registran en)
  • mostrar la página que estaban visitando

Si uno de los requisitos anteriores no se cumple, los redirige a la página de inicio de sesión.

Por razones de seguridad es posible que desee renovar el azar remember_me_token cada vez que el usuario inicia sesión. También puede actualizar la fecha de caducidad de la cookie cada vez que el usuario inicia sesión. De esta manera se quedará conectado.

Sería demasiado trabajo escribir todo el código para usted, pero espero que esto lo ayude a implementar esta funcionalidad usted mismo. Por favor comente si tiene alguna pregunta. Buena suerte.

+0

Muy buena y segura respuesta. Kudos – seedg

+0

'expirará' => 1209600 debe ser tan 'expirará' => tiempo() + 1209600. – Namal

+3

@Priyanga, no, no debería. De la [guía del usuario] (http://ellislab.com/codeigniter/user-guide/libraries/input.html): "La caducidad se establece en segundos, que se agregará a la hora actual". – Mischa

0

Puede establecer sess_expiration a 0 y luego establecer una variable personalizada en la sesión como, remember_me = 1. Verifique este valor y destruya la sesión si es necesario después de un tiempo. Esto sería un workarround.

6

Necesitaba lo mismo. No se puede lograr esto mediante la configuración de CI, así que he elegido para reemplazar el método setcookie de la clase Session CI (en 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 
      ); 

} 

Por supuesto que necesita para establecer el indicador rememberme en la sesión sobre la base de la elección del hecho por el usuario

+0

De nuevo como se indica a continuación: Si está utilizando sesiones de base de datos, no puede usar esta solución, porque el recolector de elementos no utilizados usa sess_expiration para limpiar la tabla de sesiones. Por lo tanto, un usuario que no haya elegido "recordarme", provocará la eliminación de todas (por sus estándares) sesiones caducadas. –

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

Si utiliza este enfoque, hay que establecer 'sess_expiration' en cada recarga de la página, de lo que tiene que establecer explícitamente en cualquier lugar en el que utiliza set_userdata() o incluso set_flashdata(). Esto se debe a que la cookie se sobrescribirá con lo que haya configurado en la configuración. –

+0

Si está utilizando sesiones de base de datos, no puede usar esta solución, porque el recolector de elementos no utilizados usa sess_expiration para limpiar la tabla de sesiones. Por lo tanto, un usuario que no haya elegido "recordarme", provocará la eliminación de todas (por sus estándares) sesiones caducadas. –

2

Puede usar isset para verificar si la cookie tiene un valor, y si la cookie se elimina, se mostrará como negativa. Si es negativo, puede volver a configurar la cookie ... por supuesto, esto será como "renovar" la cookie, por lo que si el usuario no vence, se olvidará. (Establecer un gran tiempo hasta la expiración!)

Por ejemplo:

<?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

Solía ​​ganchos para hacer esto

  1. Habilitar ganchos en "config.php" establecer $config['enable_hooks'] = TRUE;

  2. En su controlador de inicio de sesión, guarde el valor de la casilla de verificación en la sesión

    $this->session->set_userdata('remember_me', $this->input->post('remember_me')); 
    
  3. En su "hooks.php" archivo añadir esta

    $hook['post_controller_constructor'] = array(
        'class'  => 'Change_Config', 
        'function' => 'change_session_expiration', 
        'filename' => 'change_config.php', 
        'filepath' => 'hooks' 
    ); 
    
  4. En sus "ganchos" carpeta crear un archivo llamado "change_config.php" y pega este

    <?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; 
         } 
        } 
    } 
    
Cuestiones relacionadas