Projet

Général

Profil

Actions

Souhaits #500

fermé

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

Ajouté par Mélissa Djebel il y a environ 11 ans. Mis à jour il y a presque 7 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Catégorie:
Core
Version cible:
Début:
26/01/2013
Echéance:
% réalisé:

100%

Temps estimé:

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 :) )

Mis à jour par Mélissa Djebel il y a environ 11 ans

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

Mis à jour par Johan Cwiklinski il y a environ 11 ans

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.

Mis à jour par Johan Cwiklinski il y a environ 11 ans

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)

Mis à jour par richard kevin il y a environ 11 ans

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

Mis à jour par Mélissa Djebel il y a environ 11 ans

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.

Mis à jour par Johan Cwiklinski il y a environ 11 ans

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 ?

Mis à jour par Mélissa Djebel il y a environ 11 ans

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);

Mis à jour par Johan Cwiklinski il y a environ 11 ans

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 ;)).

Mis à jour par boh waz il y a environ 11 ans

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.

Mis à jour par Johan Cwiklinski il y a environ 11 ans

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

Mis à jour par Johan Cwiklinski il y a presque 7 ans

  • Statut changé de Nouveau à Résolu
  • % réalisé changé de 0 à 100

Mis à jour par Johan Cwiklinski il y a presque 7 ans

  • Catégorie mis à Core
  • Statut changé de Résolu à Fermé
  • Assigné à mis à Johan Cwiklinski
  • Version cible mis à 0.9

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

Actions

Formats disponibles : Atom PDF