Установить cookie сессии только когда пользователь вошел в систему

Я создаю приложение на основе ZF3 и пытаюсь получить сессионный cookie для установки только когда пользователь успешно вошел в систему. И удалите его при выходе.

Кажется, что нет такой функции в сеансе ZF3, или, по крайней мере, я не смог найти ее в конфигурация Zend-сессии документация.

Прямо сейчас, структура создает PHPSESSID cookie сеанса (имя по умолчанию), когда открыта какая-либо страница и не найден cookie сеанса.

До тех пор, пока пользователь фактически не войдет в систему, этот файл cookie будет бесполезен для моего приложения, поскольку у меня нет необходимости запоминать данные сеанса для гостей.

Я пытаюсь изменить это поведение, чтобы модель генерации cookie сеанса была такой:

  • Не создавайте cookie сессии, пока не произойдет действительный вход в систему. Просто отнеситесь к сеансу как к новому, но пропустите создание файла cookie.
  • Создайте cookie сеанса, когда пользователь входит в систему, с временем жизни, указанным в конфигурации.
  • Удалите cookie сессии, когда пользователь выйдет из системы.

Любые указатели приветствуются.

0

Решение

На всякий случай, если кто-то задает аналогичный вопрос.

После небольшого поворота я нашел решение, но также обнаружил некоторые нежелательные побочные эффекты.

Как отметил Raphioly-San в комментарии к вопросу, вам необходимо получить доступ к сеансу, чтобы определить, вошел ли пользователь в систему. Это означает, что вам нужно запускать сеанс каждый раз. Это, в свою очередь, генерирует куки сессии.

Таким образом, единственное решение состоит в том, чтобы уничтожить cookie-файл сеанса по завершении работы приложения, если пользователь не вошел в систему, и не препятствовать созданию cookie-файла сеанса вообще.

Реализация

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

namespace Application;

class Module
{
public function onBootstrap(MvcEvent $event) {
$event->getApplication()
->getEventManager()
->attach(
MvcEvent::EVENT_FINISH,
function() use ($event){
// Stop if a user is logged in
$userLoggedIn = $event->getApplication()->getServiceManager()->get(AuthenticationService::class)->hasIdentity();

if ($userLoggedIn) {
return;
}

// Destroy session cookie
// Note: this is not the most elegant solution, but it will suffice for this example
$params = session_get_cookie_params();
setcookie(session_name(), '', 1, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
session_destroy();
session_write_close();
},
-999
);
}
}

Уничтожение сеансовых перерывов на cookie по крайней мере компонент флеш-мессенджера, когда он используется для гостей.

Другие компоненты также могут не работать должным образом.

Я исследовал это решение по запросу администратора сервера, поскольку файлы cookie вызывают проблемы при использовании системы кэширования Varnish.

Хотя базовая реализация работает, я все еще исследую побочные эффекты.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]