Symfony реализует функции регистрации пользователей и уничтожения файлов cookie. Существует LogoutListener
который делегирует эти действия нескольким обработчикам выхода: CookieClearingLogoutHandler
и SessionLogoutHandler
.
Если мы хотим вручную вывести пользователя из приложения, я считаю, что лучшим способом было бы назвать эти обработчики, а не реализовывать (дублировать) такую низкоуровневую логику самостоятельно.
Можно ли это сделать?
Вы можете реализовать расширенный регистратор-выход, переопределив службу security.logout_listener
по умолчанию.
Метод LogoutListener::requiresLogin(...)
умолчанию проверяет только, является ли путь запроса равным параметру logout_path
брандмауэра.
Это выглядит так:
protected function requiresLogout(Request $request) { return $this->httpUtils->checkRequestPath( $request, $this->options['logout_path'] ); }
Предположим теперь, что вы хотите выполнить выход из системы, если для параметра logout
session-parameter установлено значение true
.
Поэтому мы расширяем класс LogoutListener
и добавляем наш собственный метод LogoutListener
requiresLogout()
с дополнительной логикой.
namespace Your\Name\Space; use Symfony\Component\Security\Http\Firewall\LogoutListener; use Symfony\Component\HttpFoundation\Session\SessionInterface; class MyLogoutListener extends LogoutListener { /** * Whether this request is asking for logout. * * @param Request $request * * @return Boolean */ protected function requiresLogout(Request $request) { if ( $request->getSession()->get('logout') ) { return true; } return parent::requiresLogout($request); }
После этого мы просто переопределяем параметр container.logout_listener.class с нашим пользовательским классом в нашем config.yml
.
parameters: security.logout_listener.class: \Your\Name\Space\MyLogoutListener
Теперь вы можете выйти из системы внутри ...Controller
:
public function someAction(Request $request) { // ... some logic here if ($condition) { $request->getSession()->set('logout', true); } }