В настоящее время я пытаюсь реализовать механизм выхода из нашего приложения в Spring Boot 2 с помощью Spring Security.
Моя конфигурация выхода из системы безопасности для пружин:
http
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/logout.html"))
.logoutSuccessHandler(logoutSuccessHandler)
.addLogoutHandler(handler1)
.addLogoutHandler(handler2)
.clearAuthentication(false);
В этой конфигурации Spring добавляет оба обработчика в LogoutFilter
вместе с собственным SecurityContextLogoutHandler
Spring как последним обработчиком в цепочке обработчиков.
Проблема, с которой мы сталкиваемся, заключается в том, что в нашем пользовательском LogoutSuccessHandler
мне нужно иметь доступ к некоторым переменным, хранящимся в Authentication
в контексте безопасности, но контекст очищается в SecurityContextLogoutHandler
, даже когда .clearAuthentication(boolean clearAuthentication)
установлено на false
.
Что я действительно не понимаю, так это реализация метода logout
в SecurityContextLogoutHandler
.
public void logout(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) {
Assert.notNull(request, "HttpServletRequest required");
if (invalidateHttpSession) {
HttpSession session = request.getSession(false);
if (session != null) {
logger.debug("Invalidating session: " + session.getId());
session.invalidate();
}
}
if (clearAuthentication) {
SecurityContext context = SecurityContextHolder.getContext();
context.setAuthentication(null);
}
SecurityContextHolder.clearContext();
}
Даже когда я установил для clearAuthentication
значение false, это не имеет значения, потому что последняя строка метода SecurityContextHolder.clearContext();
все равно очистит его.
Какой смысл флага clearAuthentication
и как сохранить Аутентификацию, если мне нужно?