SecurityContextLogoutHandler очищает аутентификацию, даже если установлено значение «ложь» - PullRequest
0 голосов
/ 04 сентября 2018

В настоящее время я пытаюсь реализовать механизм выхода из нашего приложения в 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 и как сохранить Аутентификацию, если мне нужно?

1 Ответ

0 голосов
/ 04 сентября 2018

Я посмотрел исходный код и документы, и это основано на версии Spring Security 4.2.X.

SecurityContextHolder.clearContext(); не очищает содержимое контекста, но удаляет его из стратегии удержания SecurityContextHolder. Кроме того, доступны следующие стратегии:

  • ThreadLocal
  • Inheritable ThreadLocal
  • Global

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

В чем смысл флага clearAuthentication

JavaDocs говорят следующее: «Если true, удаляет Аутентификацию из SecurityContext для предотвращения проблем с параллельными запросами."

То есть, оно мало или совсем не имеет отношения к тому, что вы пытаетесь сделать в данном конкретном случае.

и как сохранить Аутентификацию, если мне нужно?

Вы реализуете LogoutSuccessHandler , где объект Authentication передается непосредственно в onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication). Вам не нужно делать что-то еще, чтобы получить доступ к объекту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...