Nano Hash - криптовалюты, майнинг, программирование

Безопасность Spring - получить значение файла cookie SESSION в AuthenticationSuccessHandler

Я знаю, что Spring Security создает имена файлов cookie SESSION при успешной аутентификации. Можно ли получить это значение файла 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
  }
}

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


  • Каково значение заголовка set-cookie HttpServletResponse? В виде {'Set-Cookie': 'SESSION=xxxx-xxxx-xxxx-xxxxxxx; Путь=/; HttpOnly'} ? 26.10.2020

Ответы:


1

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

Spring Session SessionRepositoryFilter оборачивает 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.

06.02.2019

2

Я получил его с помощью метода getSession().getId() из запроса. В моем примере используется реализация Webflux с Kotlin, но, по-видимому, в реализации HttpServletRequest работает аналогично, см. https://javaee.github.io/javaee-spec/javadocs/javax/servlet/http/HttpServletRequest.html#getSession--

class AuthenticationSuccessHandler : ServerAuthenticationSuccessHandler {
  private val location = URI.create("https://redirect.page")
  private val redirectStrategy: ServerRedirectStrategy = DefaultServerRedirectStrategy()

  override fun onAuthenticationSuccess(webFilterExchange: WebFilterExchange?, authentication: Authentication?): Mono<Void> {
    val exchange = webFilterExchange!!.exchange
    return exchange.session.flatMap {
      it.id // 87b5639c-7404-48a1-b9da-3ca47691a962
      this.redirectStrategy.sendRedirect(exchange, location)
    }
  }
}
25.10.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..