Я реализовал компонент безопасности Symfony следующим образом:
$app['security.firewalls'] = array(
'unsecured_area' => array(
pattern' => new RequestMatcher('^/log(in|out).*', null, 'GET')
)
, 'secured_area' => array(
'pattern' => '.*',
'edir' => true,
'users' => $app['security.user_provider.custom'],
'switch_user' => array('parameter' => '_switch_user', 'role' => 'ROLE_ALLOWED_TO_SWITCH')
)
);
Когда я вызываю маршрут выхода из системы, я просто отменяю сессию.
Насколько я понимаю, контекст безопасности хранится в сеансе, этого должно быть достаточно, чтобы выйти из системы моего пользователя. Но он не вышел из системы.
Если я обновлю свой брандмауэр, поместив маршрут выхода в защищенную область, $session->invalidate()
работает нормально и пользователь вышел из системы …
Почему это не работает в незащищенной области? Необеспеченная область не означает отсутствие сессии, не так ли?
Проще говоря, в незащищенной области Symfony2 использует то, что он называет AnonymousToken, даже если у него есть активный сеанс, он не заполнен учетными данными пользователя.
Следовательно, ваш пользователь не может выйти из системы, поскольку он не находится в состоянии входа в систему, информация о пользователе не находится в токене или сеансе.
надеюсь, это поможет
Других решений пока нет …