Project

General

Profile

Souhaits #500

Rester connectée longtemps (1 mois ... + ?)

Added by Mélissa Djebel about 8 years ago. Updated over 3 years ago.

Status:
Fermé
Priority:
Normal
Category:
Core
Target version:
Start date:
01/26/2013
Due date:
% Done:

100%

Estimated time:
Vote:

Description

Bonjour,

serait-il possible d'avoir une case à cocher sur la page de login de Galette pour la sauvegarde d'un cookie valable un temps certain, voir un certain temps (genre de 1 à 6 mois) pour rester connectée même quand on ferme son navigateur ?

Une case à cocher "se souvenir de moi".

J'aime bien quand un site m'accueille avec sa page de membre connecté plutôt que la page de login même quand je ne suis pas venue quelques jours (et surtout si je dois y venir chaque jour, j'aime bien me sentir accueillie :) )

#1

Updated by Mélissa Djebel about 8 years ago

Ah!
J'ai le wish #500 tout rond.
Ça me permet de faire un vœu ou j'ai droit à un cadeau ? ;-)

#2

Updated by Johan Cwiklinski about 8 years ago

Si j'étais toi, je miserai d'avantage sur le voeu :D

Oui, c'est vrai que de rester connecté dépend actuellement de la longueur de session par défaut sur le serveur ; et ud navigateur utilisé (firefox ne ferme pas les sessions ; lorsqu'il est rouvert, je me retrouve de nouveau connecté ; je n'ai docn pas ton problème :p).

Cela étant dit, je ne sais pas si un cookie est la meilleure des solutions ; il faudrait que je me penche un peu sur la question pour voir les différents possibilités.

#3

Updated by Johan Cwiklinski about 8 years ago

Ptètre qu'un simple truc de ce genre là ferait l'affaire :

$session_expires = new DateTime()->add(new DateInterval('P1M');
session_set_cookie_params(strtotime($session_expires->format('d-m-Y')) - time()); 

À placer avant le session_start() dans galette/includes/galette.inc.php.

(je n'ai pas testé ce code)

#4

Updated by richard kevin about 8 years ago

Bonjour,

je travail sur cette tache j'ai tester le code mais il fonctionne pas . svp vous pouvez m'aider un peut plus par rapport à cette tache merci

#5

Updated by Mélissa Djebel about 8 years ago

J'utilise aussi firefox et la méthode de rallongement de la session n'a pas donné de résultat chez moi.

Ce que je propose :

  • Fichier lib\Galette\Core\Login.php, dans la fonction logIn($user, $passe), dans la partie authentification réussie, au même endroit que
    Analog::log('User `' . $user . '` logged in.', Analog::INFO);
    
    Ajouter :
    \setcookie(PREFIX_DB . NAME_DB . '_login', $user . '$' . $passe, time() + 60 * 60 * 24 * 30);
    
  • Dans la fonction logOut() du fichier lib\Galette\Core\Authentication.php, ajouter :
\setcookie(PREFIX_DB . NAME_DB . '_login');
unset($_COOKIE[PREFIX_DB . NAME_DB . '_login']);
  • Enfin dans index.php, juste après le if (isset($_GET['logout'])) {...}, ajouter :
if (array_key_exists(PREFIX_DB . NAME_DB . '_login', $_COOKIE)) {
    list($user, $pwd) = split('$', $_COOKIE[PREFIX_DB . NAME_DB . '_login']);
    if (strlen($user) > 0 && strlen($pwd)) {
        $login->logIn($user, $pwd);
        if ($login->isLogged()) {
            $session['login'] = serialize($login);
            /** FIXME: users should no try to go to admin interface */
            if ($login->isAdmin() || $login->isStaff()) {
                if (!isset($_COOKIE['show_galette_dashboard'])
                        || $_COOKIE['show_galette_dashboard'] == 1
                ) {
                    header('location: desktop.php');
                    die();
                } else {
                    header('location: gestion_adherents.php');
                    die();
                }
            } else {
                header('location: voir_adherent.php');
                die();
            }

        }
    }
}

Testé avec IE, ça marche comme attendu (et y'a pas de raison que ça marche pas avec les autres). Par contre, pas sur que l'admin reste connecté, mais bon, c'est moins grave ^^

Ca duplique un peu le code dans index.php et c'est un peu moche, y'a moyen d'améliorer je pense, par exemple en sortant les $_POST['login'] du if pour récupérer la valeur cookie si elle existe.

#6

Updated by Johan Cwiklinski about 8 years ago

Mélissa Djebel a écrit :

\setcookie(PREFIX_DB . NAME_DB . '_login', $user . '$' . $passe, time() + 60 * 60 * 24 * 30);

Une remarque : utiliser le mot de passe (sous quelque forme que ce soit) dans un cookie, c'est hors de question... Je ne suis pas très chaud pour le login non plus.

Il y a déjà un cookie, pour la session, qui ne contient pas ce type d'informations ; pas vraiment la peine d'en créer un autre (moins il y en a à gérer, mieux c'est). Cette solution implique par ailleurs un passage obligatoire sur index.php, entrainant de multiples requêtes HTTP pour pas grand chose finalement.

Bref, ça ne me semble pas vraiment une bonne idée.

Je n'ai toujours pas eu le temps de tester quoi que ce soit de mon côté (et je ne l'aurai pas avant un moment) ; mais la fonction session_set_cookie_params et son corolaire session_get_cookie_params sont censées faire le boulot ; à condition que le serveur le permette (je n'ai aucune idée de qui le permet ou pas) bien évidemment (cf. http://www.php.net/manual/fr/session.configuration.php#ini.session.cookie-lifetime).

La valeur par défaut, 0, rend le cookie de session caduque lorsque le navigateur est fermé ; Firefox étant un cas particulier car si on ré-ouvre les onglets précédemment ouverts, la session est conservée (ça ne vaut pas si les onglets ne sont pas récupérés à l'ouverture). Ceci bien évidemment avec une configuration de base côté serveur, et un session.cookie_lifetime à 0.

Est-ce que dans vos tentatives, l'appel à session_set_cookie_params a bien été effectué avant le session_start ? Est-ce qu'une erreur est renvoyée dans les logs système ?

#7

Updated by Mélissa Djebel about 8 years ago

En effet, il suffit j'ai bien l'impression de faire simplement :

session_set_cookie_params(60 * 60 * 24 * 30); 
//we start a php session
session_start();

J'avais mal lu la définition de session_set_cookie_params. Elle demande un temps absolu en paramètre, pas la date à laquelle la session va échoir. Elle fait le calcul seule. Et c'est bon, finit. Ça marche comme attendu.

Éventuellement, mettre un define("DAYS_SESSION", 30); dans config.inc.php pour laisser à l'administrateur du site la possibilité de choisir sa durée de session (0 = à la fermeture du navigateur, sinon en nombre de jours)

session_set_cookie_params(60 * 60 * 24 * DAYS_SESSION);

#8

Updated by Johan Cwiklinski about 8 years ago

Mélissa Djebel a écrit :

J'avais mal lu la définition de session_set_cookie_params. Elle demande un temps absolu en paramètre, pas la date à laquelle la session va échoir. Elle fait le calcul seule. Et c'est bon, finit. Ça marche comme attendu.

Cool, super :)

Éventuellement, mettre un define("DAYS_SESSION", 30); dans config.inc.php pour laisser à l'administrateur du site la possibilité de choisir sa durée de session (0 = à la fermeture du navigateur, sinon en nombre de jours)

Ouais, un paramètre quelque part (mais pas dans le config.inc.php qui est actuellement écrasé à chaque mise à jour ;)).

#9

Updated by boh waz about 8 years ago

ca ne marchera que pour les serveurs qui n'ont ni debian ni ubuntu, cf les commentaires de la doc php de set cookie params.

#10

Updated by Johan Cwiklinski about 8 years ago

boh waz a écrit :

ca ne marchera que pour les serveurs qui n'ont ni debian ni ubuntu, cf les commentaires de la doc php de set cookie params.

C'est très juste, merci de la précision :)

Au vu du peu de travail impliqué au final par la demande ; j'ajouterai ce paramètre dans un coin en précisant les limitations connues. En gros : pour ceux pour qui ça marche, tant mieux (enfin, tant que ça ne cause pas de bogues ; je ne crois pas que ce soit le cas) :p

#11

Updated by Johan Cwiklinski over 3 years ago

  • Status changed from Nouveau to Résolu
  • % Done changed from 0 to 100
#12

Updated by Johan Cwiklinski over 3 years ago

  • Category set to Core
  • Status changed from Résolu to Fermé
  • Assignee set to Johan Cwiklinski
  • Target version set to 0.9

Possible en 0.9 en définissant la constante GALETTE_TIMEOUT via le fichier config/behavior.inc.php :)

Also available in: Atom PDF