Я создаю приложение на основе ZF3 и пытаюсь получить сессионный cookie для установки только когда пользователь успешно вошел в систему. И удалите его при выходе.
Кажется, что нет такой функции в сеансе ZF3, или, по крайней мере, я не смог найти ее в конфигурация Zend-сессии документация.
Прямо сейчас, структура создает PHPSESSID
cookie сеанса (имя по умолчанию), когда открыта какая-либо страница и не найден cookie сеанса.
До тех пор, пока пользователь фактически не войдет в систему, этот файл cookie будет бесполезен для моего приложения, поскольку у меня нет необходимости запоминать данные сеанса для гостей.
Я пытаюсь изменить это поведение, чтобы модель генерации cookie сеанса была такой:
Любые указатели приветствуются.
На всякий случай, если кто-то задает аналогичный вопрос.
После небольшого поворота я нашел решение, но также обнаружил некоторые нежелательные побочные эффекты.
Как отметил 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.
Хотя базовая реализация работает, я все еще исследую побочные эффекты.
Других решений пока нет …