Bonjour,

Je développe un système où j'ai besoin de maintenir un utilisateur connecté tant qu'il n'a pas fermé la page.
En fait, la page dialogue avec Cake en AJAX toutes les minutes pour récupérer certaines données et il arrive que la session de connexion se termine alors que la page est ouverte, ce qui empêche de récupérer les données.

J'ai tenté de reloguer l'utilisateur à chaque fois que ma fonction refresh() est appelée en faisat ceci :

$this->Auth->logout();
$this->Auth->login($id);

Mais cela me génère une erreur de session_regenerate_id() et me perturbe toute ma Session.

Je ne sais pas comment faire pour régler ce problème. Une idée ?

Merci d'avance !

3 réponses


Salut,

Dans le core.php tu as tout un passage pour la configuration des sessions.

/**
 * Session configuration.
 *
 * Contains an array of settings to use for session configuration. The defaults key is
 * used to define a default preset to use for sessions, any settings declared here will override
 * the settings of the default config.
 *
 * ## Options
 *
 * - `Session.cookie` - The name of the cookie to use. Defaults to 'CAKEPHP'
 * - `Session.timeout` - The number of minutes you want sessions to live for. This timeout is handled by CakePHP
 * - `Session.cookieTimeout` - The number of minutes you want session cookies to live for.
 * - `Session.checkAgent` - Do you want the user agent to be checked when starting sessions? You might want to set the
 * value to false, when dealing with older versions of IE, Chrome Frame or certain web-browsing devices and AJAX
 * - `Session.defaults` - The default configuration set to use as a basis for your session.
 * There are four builtins: php, cake, cache, database.
 * - `Session.handler` - Can be used to enable a custom session handler. Expects an array of of callables,
 * that can be used with `session_save_handler`. Using this option will automatically add `session.save_handler`
 * to the ini array.
 * - `Session.autoRegenerate` - Enabling this setting, turns on automatic renewal of sessions, and
 * sessionids that change frequently. See CakeSession::$requestCountdown.
 * - `Session.ini` - An associative array of additional ini values to set.
 *
 * The built in defaults are:
 *
 * - 'php' - Uses settings defined in your php.ini.
 * - 'cake' - Saves session files in CakePHP's /tmp directory.
 * - 'database' - Uses CakePHP's database sessions.
 * - 'cache' - Use the Cache class to save sessions.
 *
 * To define a custom session handler, save it at /app/Model/Datasource/Session/<name>.php.
 * Make sure the class implements `CakeSessionHandlerInterface` and set Session.handler to <name>
 *
 * To use database sessions, run the app/Config/Schema/sessions.php schema using
 * the cake shell command: cake schema create Sessions
 *
 */
    Configure::write('Session', array(
        'defaults' => 'php'
    ));

Tu peux regarder l'option "Session.timeout" et mettre tout plein de minutes comme dans leur exemple

<?php
Configure::write('Session', array(
    'defaults' => 'php',
    'cookie' => 'my_app',
    'timeout' => 4320 //3 days
));

ou alors peut-etre "Session.autoRegenerate" qui semble faire ce que tu recherches.

See you :)

Merci pour ton aide, j'avais bien jeté un coup d'oeil à core.php et à la config des sessions, mais je n'avais pas trouvé n'y dans le fichier, n'y sur Internet d'explication quand à la régénération des sessions.

J'ai fais ceci :

Configure::write('Session', array(
    'defaults' => 'php',
    'timeout' => 4320,
    'cookieTimeout' => 7200,
    'autoRegenerate' => true
));

Si je comprend bien le code, la session va se régénérer à chaque interaction avec le serveur ?

Bon, au final, ça n'a pas l'air de marcher, ça me déconnecte au premier rechargement ou changement de page :/

EDIT
J'obtiens cette erreur, je pense, toutes les 10 requêtes, ce qui correspondrait peut être avec le nombre de requestCountdown ?
"Warning session_regenerate_id() : Session object destruction failed "

Je précise que je teste tout ceci en local, je peux pas mettre cette fonctionnalité en production si elle est buguée.