Как вызвать пользовательскую функцию на время сеанса sfGuard в Symfony - PullRequest
3 голосов
/ 29 декабря 2010

Я использую sfGuard в качестве плагина аутентификации в моем проекте.Я хочу вызывать определенные сценарии на стороне клиента и на стороне сервера по истечении времени ожидания сеанса.Как лучше всего это сделать.

Пожалуйста, помогите!Большое спасибо.

1 Ответ

2 голосов
/ 30 декабря 2010

Ну, я читал sfGuardSecurityUser, и он расширяет класс sfBasicSecurityUser, который обрабатывает аутентификацию пользователя, профиль, учетные данные и т. Д. Итак, я нашел функцию в sfBasicSecurityUser, которая определяет, рассчитана ли сессия пользователей по времени, называется isTimedOut, а также setTimedOut.

Если вы хотите что-то сделать, когда время сеанса пользователя истекло, по крайней мере, на стороне сервера, вы должны прослушать событие, которое выбрасывается, когда это происходит. Проверьте этот метод:

это можно найти в symfony_core_root_dir / lib / user / sfBasicSecurityUser.class.php

  public function initialize(sfEventDispatcher $dispatcher, sfStorage $storage, $options = array())
  {
    // initialize parent
    parent::initialize($dispatcher, $storage, $options);

    if (!array_key_exists('timeout', $this->options))
    {
      $this->options['timeout'] = 1800;
    }

    // force the max lifetime for session garbage collector to be greater than timeout
    if (ini_get('session.gc_maxlifetime') < $this->options['timeout'])
    {
      ini_set('session.gc_maxlifetime', $this->options['timeout']);
    }

    // read data from storage
    $this->authenticated = $storage->read(self::AUTH_NAMESPACE);
    $this->credentials   = $storage->read(self::CREDENTIAL_NAMESPACE);
    $this->lastRequest   = $storage->read(self::LAST_REQUEST_NAMESPACE);

    if (null === $this->authenticated)
    {
      $this->authenticated = false;
      $this->credentials   = array();
    }
    else
    {
      // Automatic logout logged in user if no request within timeout parameter seconds
      $timeout = $this->options['timeout'];
      if (false !== $timeout && null !== $this->lastRequest && time() - $this->lastRequest >= $timeout)
      {
        if ($this->options['logging'])
        {
          $this->dispatcher->notify(new sfEvent($this, 'application.log', array('Automatic user logout due to timeout')));
        }

        $this->setTimedOut();
        $this->setAuthenticated(false);
      }
    }

    $this->lastRequest = time();
  }

На стороне клиента вы можете начать думать о HTML 5 и Javascript Workers . Идея может заключаться в том, чтобы установить работника при загрузке страницы и заставить его считать до session_time_out, а затем перенаправить на страницу входа или что-то в этом роде.

...