Spring добавляет JSESSIONID, несмотря на управление сеансом без сохранения состояния

Я использую рабочую аутентификацию JWT своего веб-приложения со следующей конфигурацией:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
      .csrf().disable()
      .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
      .and()
      .exceptionHandling()
      .authenticationEntryPoint(
          (req, rsp, e) -> p.sendError(HttpServletResponse.SC_UNAUTHORIZED))
      .and()
      .addFilter(new UsernamePasswordAuthenticationFilter(authenticationManager(),
          jwtConfig))
      .addFilterAfter(new JwtTokenAuthenticationFilter(jwtConfig),
          UsernamePasswordAuthenticationFilter.class)
      .authorizeRequests()
      .antMatchers(HttpMethod.POST, jwtConfig.getUri()).permitAll()
      .anyRequest().authenticated();
}

Что касается SessionCreationPolicy.STATELESS, я ожидаю, что Spring не создаст сам сеанс. Однако, если я обращаюсь к любому другому ресурсу, кроме /login, я все равно вижу следующую запись в заголовке ответа:

set-cookie: JSESSIONID=...; Path=/; HttpOnly

Может ли кто-нибудь объяснить, откуда это происходит (возможно, не из Spring), и если он все еще исходит из Spring, что нужно изменить?

Редактировать:

При тестировании в моем контроллере сеанс все еще вводится, о чем свидетельствует наличие указанного выше токена. Я до сих пор не понимаю, откуда это взялось.

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public void create(HttpSession session) {
    if (session != null) {
        System.out.println("Session is existing"); // executes
    }
}

в документе говорится НЕЗАВИСИМЫЙ Spring Security никогда не будет создавать HttpSession и никогда не будет использовать его для получения SecurityContext., который, я полагаю, переопределен порядком ваших лямбд. Но не спрашивайте меня о рабочем порядке: /

Gewure 30.09.2018 02:15

@Gewure Большое спасибо, попробую немного поиграться. Может быть, это поможет!

Glains 30.09.2018 02:19

Возможно, вы используете JSP? Они любовь создают сеансы.

Boris the Spider 30.09.2018 16:51

@BoristheSpider Не использует JSP, но хороший момент!

Glains 01.10.2018 22:01

@Gewure Reordering не помогло, но спасибо за ваши усилия!

Glains 01.10.2018 22:02

Сессия всегда будет внедряться (и создаваться, если таковая не существует), если вы запросите это, это не имеет ничего общего с установкой Spring Security в состояние без сохранения состояния. Это только настройка Spring Security, а НЕ остальная часть вашего приложения. Если вы используете JSP, вы всегда будете получать сеанс, и в зависимости от ваших контроллеров, которые также могут создавать сеанс.

M. Deinum 02.10.2018 11:43

@ M.Deinum Есть ли возможность отключить это глобально, или мне не стоит беспокоиться об этом и просто игнорировать это?

Glains 02.10.2018 12:26

Единственный способ - это взломать ваш контейнер сервлетов и предотвратить это там, но зачем беспокоиться ... В настоящее время вы делаете это самостоятельно (я подозреваю) или другим фильтром в вашем изменении. Вы можете изменить свой метод публикации, чтобы использовать HttpServeltRequest и использовать getSession(false) для предотвращения создания экземпляра сеанса. При определении его в качестве аргумента он автоматически создается.

M. Deinum 02.10.2018 12:28

@ M.Deinum Мне было интересно, хорошо или плохо включать идентификатор сеанса в тело ответа, поскольку он мне не нужен.

Glains 02.10.2018 20:48

Очевидно, вам это нужно, иначе сеанс не будет создан.

M. Deinum 03.10.2018 09:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
12
10
5 700
3

Ответы 3

Ваша текущая конфигурация (sessionCreationPolicy(SessionCreationPolicy.STATELESS)) гарантирует, что Spring-Security (и только Spring-Security)

  • не будет создавать сеанс
  • не будет полагаться на сеанс для предоставления деталей аутентификации (например, предоставления Principal).

Любой другой компонент вашего приложения (например, если вы будете использовать Spring-Session) все еще можно создать сеанс.

Верно ли, что любой запрос к другим ресурсам, кроме /login, будет аутентифицировать пользователя с помощью этого токена, а затем предоставить аутентифицированного пользователя в сеансе Spring?

Glains 01.10.2018 22:00

Любой другой запрос, кроме /login, должен аутентифицировать пользователя на основе JWT. С вашей текущей конфигурацией principal не должен храниться в сеансе (это обеспечивается атрибутом stateless).

user10367961 02.10.2018 05:17

Тогда я все еще понятия не имею, откуда идет сеанс. Я внес правку, чтобы подтвердить, что сеанс введен. Помимо конфигурации безопасности и моей аутентификации JWT, это всего лишь простой запрос. Есть еще идеи?

Glains 02.10.2018 11:37

Этот ответ помогает? stackoverflow.com/a/14510798/5022951

Mat 13.08.2020 16:47

@Glains, вы исправили эту проблему? пожалуйста, поделитесь им. иметь такую ​​же проблему

Lana 05.01.2021 12:26

Попробуйте установить для сеанса значение none в application.yml:

spring.session.store-type=none

как указано в документах: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-session.html

также я нашел: .and (). sessionManagement (). sessionCreationPolicy (SessionCrea‌tionPolicy.NEVER)

nils petersohn 05.07.2019 13:02

Даже с SessionCreationPolicy.STATELESS сеанс все еще может быть создан вне области безопасности Spring. Например, когда вы вызываете request.getSession () или request.getSession (true), или если вы обращаетесь к bean-компоненту с ограниченным сеансом (внутренне Spring вызовет request.getSession (true)).

Если вы добавите следующее в свой application.properties, трассировка стека будет выводиться каждый раз при создании сеанса, что может помочь вам узнать, что происходит.

logging.level.org.springframework.session.web.http.SessionRepositoryFilter.SESSION_LOGGER=DEBUG

Другие вопросы по теме