Безопасность Spring - получите значение куки SESSION в AuthenticationSuccessHandler - PullRequest
0 голосов
/ 31 января 2019

Я знаю, что Spring Security создает сессию имен файлов cookie при успешной аутентификации.Можно ли получить это значение cookie в AuthenticationSuccessHandler.

У меня есть следующая реализация, внутри которой мне нужно это значение cookie SESSION.Я выглядел как заголовки ответа HttpServletResponse, но у них есть заголовки XSRF-TOKEN set-cookie,

@Component
public class MyAuthenticationSuccessHandler implements AuthenticationSuccessHandler {

  @Override
  public void onAuthenticationSuccess(
      HttpServletRequest request, HttpServletResponse response, Authentication authentication)
      throws IOException {

   // GET SESSION, COOKIE VALUE HERE
  }
}

Не могли бы вы помочь.

1 Ответ

0 голосов
/ 07 февраля 2019

Файл cookie SESSION создается с помощью DefaultCookieSerializer Spring Session, который вызывается каждый раз при создании нового сеанса, и не обязательно после успешной аутентификации.

SessionRepositoryFilter Spring Session * обертывает запрос HttpServletRequest в такойТаким образом, всякий раз, когда вы получаете HttpSession из запроса в любой точке вашего приложения, вы фактически получаете объект Spring Session.Однако этот файл cookie записывается в ответ после вызова вашего обработчика, как вы можете видеть в SessionRepositoryFilter:

try {
        filterChain.doFilter(wrappedRequest, wrappedResponse);
    }
    finally {
        wrappedRequest.commitSession(); //the SESSION cookie is created if necessary
    }

Так что, если сеанс был только что создан для этого запроса ...

  1. Файл cookie не будет доступен в запросе HttpServletRequest, поскольку файл cookie еще не отправлен (и поэтому браузер не смог его отправить)
  2. Файл cookie не будетHttpServletResponse как заголовок «Set-Cookie», так как он будет записан после того, как ваше приложение обработало запрос.

Однако вы можете получить значение cookie:

String cookieValue = request.getSession().getId();

Примечание: Приведенный выше код заставит Spring Session создать Redis / Jdbc / etc, поддерживаемый сессией, который позже будет использован для создания файла cookie SESSION.

...