web-dev-qa-db-fra.com

Comment créer la case à cocher "Se souvenir de moi" à l'aide de la bibliothèque de sessions Codeigniter?

dans Codeigniter je construis un système d'authentification pour mon site web et pour cela j'utilise la bibliothèque de session

     session->set_userdata('username')

cela sauvera la session - je crois - pendant un certain temps

Je souhaite fournir une case à cocher "Se souvenir de moi" dans le formulaire de connexion afin que l'utilisateur puisse enregistrer la session pour toujours - n'a pas pu trouver un moyen de sauvegarder la session pour toujours!?

Remarque: $ sess_expiration ne fonctionnera pas car il définit la date d'expiration pour tous les utilisateurs et ce que je veux faire est de définir la date d'expiration en fonction de ses préférences

est-ce possible? et comment faire?

Merci

25
ahmed

Si la case à cocher Se souvenir de moi est cochée, vous définissez un cookie sur le système de l'utilisateur avec une chaîne aléatoire. Par exemple.:

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

set_cookie($cookie);

Vous enregistrez également cette chaîne aléatoire dans la table users, par exemple dans la colonne remember_me_token.

Maintenant, lorsqu'un utilisateur (qui n'est pas encore connecté) essaie d'accéder à une page qui nécessite une authentification:

  • vous vérifiez s'il existe un cookie du nom de remember_me jeton sur son système
  • s'il est là, vous vérifiez la base de données s'il y a un enregistrement avec la même valeur
  • si c'est le cas, vous recréez la session de cet utilisateur (cela signifie qu'il est connecté)
  • montrer la page qu'ils visitaient

Si l'une des conditions ci-dessus n'est pas remplie, vous les redirigez vers la page de connexion.

Pour des raisons de sécurité, vous souhaiterez peut-être renouveler le _ remember_me_token chaque fois que l'utilisateur se connecte. Vous pouvez également mettre à jour la date d'expiration du cookie à chaque fois que l'utilisateur se connecte. De cette façon, il restera connecté.

Ce serait trop de travail d'écrire tout le code pour vous, mais j'espère que cela vous aidera à implémenter cette fonctionnalité vous-même. Veuillez commenter si vous avez des questions. Bonne chance.

65
Mischa

J'avais besoin de la même chose. Vous ne pouvez pas accomplir cela en utilisant les paramètres CI, j'ai donc choisi de remplacer la méthode setcookie de la classe CI Session (dans 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
            );

}

Bien sûr, vous devez définir le drapeau Rememberme dans votre session en fonction du choix effectué par l'utilisateur.

6
Fer

Vous pouvez utiliser isset pour vérifier si le cookie a une valeur, et si le cookie est supprimé, il retournera négatif. S'il est négatif, vous pouvez réinitialiser le cookie ... bien sûr, ce sera comme "renouveler" le cookie, donc si l'utilisateur ne vient pas à l'expiration, il sera oublié. (Réglez un très grand temps jusqu'à l'expiration!)

Par exemple:

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

J'ai utilisé des crochets pour ce faire

  1. Activer les hooks dans le paramètre "config.php" $config['enable_hooks'] = TRUE;

  2. Dans votre contrôleur de connexion, enregistrez la valeur de la case à cocher lors de la session

    $this->session->set_userdata('remember_me', $this->input->post('remember_me'));
    
  3. Dans votre "hooks.php" fichier ajoutez ceci

    $hook['post_controller_constructor'] = array(
        'class'     => 'Change_Config',
        'function'  => 'change_session_expiration',
        'filename'  => 'change_config.php',
        'filepath'  => 'hooks'
    );
    
  4. Dans vos "hooks" dossier créez un fichier appelé "change_config.php" et collez-le

    <?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;
            }
        }
    }
    
2
Danilo Colasso

Vous pouvez simplement mettre cela

if ($remember) {

  $new_expiration = (60*60*24*365);

  $this->config->set_item('sess_expiration', $new_expiration);

  $this->config->set_item('sess_expire_on_close', FALSE);

  $this->session->sess_expiration = $new_expiration;

  $this->session->sess_expire_on_close = FALSE;

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

Vous pouvez définir sess_expiration sur 0, puis définir une variable personnalisée dans la session, comme Remember_me = 1. Vérifiez cette valeur et détruisez la session si nécessaire après un certain temps. Ce serait une solution de contournement.

0
Herr