web-dev-qa-db-fra.com

Délai d'expiration de session CakePHP sur inactivité uniquement

Donc le noeud de cette question est juste comment empêcher CakePHP de désauthentifier une session UNIQUEMENT après une période d'inactivité.

Donc, si l'utilisateur ne fait rien, je m'attends à ce que CakePHP les déconnecte après une période de 30 minutes. Cependant, si l'utilisateur choisit de visiter une page à la 28ème minute d'inactivité, CakePHP devrait alors "réinitialiser" le compteur de dépassement de délai.

Cela ne se produit pas actuellement. Quelle que soit l'activité, CakePHP expire après l'heure spécifiée dans ma configuration principale (app/Config/core.php).

Voici mon code de configuration:

Configure::write('Session', array(
    'defaults' => 'cake',
    'timeout' => '30'
));

Des idées?

24
Kyle O'Brien

Après avoir rencontré le même problème, j'ai constaté que cela était dû à la valeur Session.cookieTimeout. Bien que la session php soit toujours valide, la date d'expiration du cookie de session n'est pas actualisée.

C'est maintenant ma config de session

Configure::write('Session', array(
        'defaults' => 'php',
        'timeout' => 30, // The session will timeout after 30 minutes of inactivity
        'cookieTimeout' => 1440, // The session cookie will live for at most 24 hours, this does not effect session timeouts
        'checkAgent' => false,
        'autoRegenerate' => true, // causes the session expiration time to reset on each page load
    ));
27
Rob Forrest

Alors que la valeur timeout est réinitialisée sur chaque page visualisée et fournit ainsi le "délai d'inactivité" requis, la date d'expiration du cookie de session du navigateur reste constante.

Ainsi, alors que la session Cake resterait en vie en interne (interne = interne à Cake) si vous rafraîchissiez à la 28e minute + 35e minute, le navigateur finissait par supprimer le cookie de session après la 30e minute.

Vous pouvez réinitialiser la date d'expiration du cookie de session via $this->Session->renew(). Ou définissez autoRegenerate = true et requestCountdown = 1 et Cake se renouvellera à chaque consultation de page.

(Mais c’est un peu ridicule de devoir régénérer la session à chaque affichage de page. En l’occurrence, sans renew(), la valeur timeout ne sera jamais prise en compte car le cookie expirera toujours à une date fixe, quelle que soit l’activité. Cela ressemble à un bug mais je n’ai pas cherché de solution de rechange.)

8
Costa

J'ai eu le même problème et je l'ai corrigé en utilisant l'option autoRegenerate:

Configure::write(
    'Session',
    array(
        'defaults' => 'cake',
        'timeout' => '30',
        'autoRegenerate' => true
    )
);

Vous pouvez également utiliser $this->Session->renew(); dans votre classe AppController.php, mais la solution ci-dessus est ma préférée.

4
Andre S

la réponse de Rob Forrest est la bonne 

Configure::write('Session', array(
        'defaults' => 'php',
        'timeout' => 30, // The session will timeout after 30 minutes of inactivity
        'cookieTimeout' => 1440
));

cookieTimeout doit être supérieur à timeout si vous souhaitez que la session expire le inactivité uniquement, vous devez définir cookieTimeout pour un très grand nombre (par exemple 60 * 24 * 10 (10 jours)).

2
Jondi
    Configure::write('Session', array(
    'defaults' => 'cake',
    'timeout' => 1440, // The session will timeout after 30 minutes of inactivity
    'cookieTimeout' => 1440, // The session cookie will live for at most 24 hours, this does not effect session timeouts
    'checkAgent' => false,
    'autoRegenerate' => true, // causes the session expiration time to reset on each page load
));

Cela fonctionne, même si la session se termine après quelques heures, il vaut mieux que se terminer en minutes.

0
imsheth