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
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:
remember_me
jeton sur son systèmeSi 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.
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.
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);
};
?>
J'ai utilisé des crochets pour ce faire
Activer les hooks dans le paramètre "config.php" $config['enable_hooks'] = TRUE;
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'));
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'
);
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;
}
}
}
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;
}
$this->session->sess_expiration = '14400'; // expires in 4 hours
$this->session->set_userdata($data); // set session
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.