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
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.
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.
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);
};
?>
j'ai utilisé les crochets pour ce faire
Activer les crochets dans "config.php" paramètre
$config['enable_hooks'] = TRUE;
dans votre controller login enregistrer la valeur de la case à cocher sur session
$this->session->set_userdata('remember_me', $this->input->post('remember_me'));
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' );
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; } } }
$this->session->sess_expiration = '14400'; // expires in 4 hours
$this->session->set_userdata($data); // set session
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.