Comment créer "remember me checkbox" en utilisant la bibliothèque de session Codeigniter?

dans Codeigniter je suis en train de construire un système D'authentification pour mon site web et pour réaliser que j'utilise la bibliothèque de session

     session->set_userdata('username')

enregistrer la session -je crois - pour un certain temps

je veux fournir une case à cocher" remember me " dans le formulaire de connexion afin que l'utilisateur peut sauver la session pour toujours - ne pouvait pas trouver un moyen de sauver la session pour toujours!?

Remarque:$sess_expiration ne fonctionnera pas parce qu'il fixe la date d'expiration pour tous les utilisateurs et ce que Je veux faire est de définir la date d'expiration basée sur ses préférences

est-ce possible? et comment le faire?

Merci

22
demandé sur ahmed 2010-10-21 08:36:39

6 réponses

si la case à cocher remember me est cochée, vous définissez un cookie sur le système de l'utilisateur avec une chaîne aléatoire. E. g.:

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

set_cookie($cookie);

vous enregistrez aussi cette chaîne aléatoire dans le users tableau, par exemple dans la colonne remember_me_token.

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

  • vous vérifiez s'il y a un cookie au nom de remember_me jeton sur son système
  • si elle est là, vous vérifiez la base de données si il y a un enregistrement avec la même valeur
  • si oui, vous recréer cette session de l'utilisateur (ce qui signifie qu'ils sont connecté)
  • afficher la page qu'ils visitent

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

Pour des raisons de sécurité, vous pouvez renouveler l'aléatoire 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 sera rester connecté.

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

57
répondu Mischa 2010-10-21 14:57:22

j'avais besoin de la même chose. Vous ne pouvez pas accomplir cela en utilisant les paramètres CI, donc j'ai choisi de surcharger la méthode setcookie de la classe de Session CI (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 avez besoin de mettre le drapeau rememberme dans votre session en fonction du choix que l'Utilisateur a fait.

6
répondu Ferdy 2010-11-02 10:42:54

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 remettre le cookie... bien sûr, ce sera comme "renouveler" le cookie, donc si l'utilisateur ne vient pas à l'expiration, ils seront oubliés. (Un très grand moment 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
répondu San Bergam 2014-04-17 03:37:23

j'ai utilisé les crochets pour ce faire

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

  2. dans votre controller login enregistrer la valeur de la case à cocher sur session

    $this->session->set_userdata('remember_me', $this->input->post('remember_me'));
    
  3. dans vos " crochets.php"le fichier ajouter

    $hook['post_controller_constructor'] = array(
        'class'     => 'Change_Config',
        'function'  => 'change_session_expiration',
        'filename'  => 'change_config.php',
        'filepath'  => 'hooks'
    );
    
  4. Dans votre "crochets" dossier créer un fichier appelé "change_config.php " et coller ceci

    <?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
répondu Danilo Colasso 2016-02-11 17:43:18
$this->session->sess_expiration = '14400';    // expires in 4 hours
$this->session->set_userdata($data);          // set session
1
répondu Jacopo 2014-02-05 08:52:26

Vous pouvez définir sess_expiration à 0 et ensuite 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 un workarround.

0
répondu Herr 2010-10-21 08:46:29