SessionTimeoutFilter.php 2.71 KB
<?php

/* 
 * (EP20201022)
 * 
 * Pour pouvoir mettre à jour les stats de connexion
 * au moment d'un timeout automatique (qui fait un logout auto sans appeler Users.logout())
 * 
 * https://stackoverflow.com/questions/32298817/how-to-prevent-cakephp-3-0-from-extending-session-timeout-with-ajax-requests
 * 
 */

namespace App\Routing\Filter;

use Cake\Core\Configure;
use Cake\Event\Event;
use Cake\Routing\DispatcherFilter;
use App\Controller\UsersController;

class SessionTimeoutFilter extends DispatcherFilter
{
    
    public function beforeDispatch(Event $event) {
        
        //debug("iciii1");
        // Si déjà TIMEOUT => on ne peut plus rien faire, donc on quitte
        //debug($_SESSION);
        $request = $event->data['request'];
        $session = $request->session();
        $session_user = $session->read('Auth.User');
        if (! $session_user) return;
        // MARCHE PAS, WHY ???????
        //if (! isset($_SESSION['Auth']['User']) ) return;
        //debug("iciii2");
        
        // Sinon, on met à jour les stats de connexion 
        (new UsersController())->statsUpdateForCurrentUserWhen($session_user, 'durant la session');
        //(new UsersController())->statsUpdateForCurrentUserDuringSession($session_user);
        //(new UsersController())->updateStatsForCurrentUserDuringSession();
        //exit;
        
        
        /*
        //debug($event->data['request']);
        //debug($event);
        
        /S @var $request \Cake\Network\Request S/
        $request = $event->data['request'];
        $session = $request->session();
        $lastAccess = $session->read('SessionTimeoutFilter.lastAccess'); // en sec
        //debug($lastAccess);

        if ($lastAccess !== null) {
            // On calcule le temps d'inactivité de l'utilisateur
            $inactivity_duration = time() - $lastAccess;
            //debug($inactivity_duration);
            //debug(Configure::read('Session.timeout')*60);
            //debug("avant");
            /S
            $sess = $_SESSION['Auth']['User'];
            $user_fullname = $sess['sn'][0].' '.$sess['givenname'][0];
            //debug($user_fullname);
            S/
            //debug("after");
            // Si ce temps d'inactivité est supérieur au timeout, on détruit la session,
            if ($inactivity_duration > Configure::read('Session.timeout') * 60) {
                // Sans doute inutile vu que logout() l'a déjà fait normalement...
                $request->session()->destroy();
            }
        }
        
        // On écrit l'heure actuelle dans la variable de session lastAccess
        if (! $request->is('ajax') )
            $session->write('SessionTimeoutFilter.lastAccess', time()); // en sec
        */
    }
    
}