Я использую рабочую аутентификацию 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
}
}
@Gewure Большое спасибо, попробую немного поиграться. Может быть, это поможет!
Возможно, вы используете JSP? Они любовь создают сеансы.
@BoristheSpider Не использует JSP, но хороший момент!
@Gewure Reordering не помогло, но спасибо за ваши усилия!
Сессия всегда будет внедряться (и создаваться, если таковая не существует), если вы запросите это, это не имеет ничего общего с установкой Spring Security в состояние без сохранения состояния. Это только настройка Spring Security, а НЕ остальная часть вашего приложения. Если вы используете JSP, вы всегда будете получать сеанс, и в зависимости от ваших контроллеров, которые также могут создавать сеанс.
@ M.Deinum Есть ли возможность отключить это глобально, или мне не стоит беспокоиться об этом и просто игнорировать это?
Единственный способ - это взломать ваш контейнер сервлетов и предотвратить это там, но зачем беспокоиться ... В настоящее время вы делаете это самостоятельно (я подозреваю) или другим фильтром в вашем изменении. Вы можете изменить свой метод публикации, чтобы использовать HttpServeltRequest и использовать getSession(false) для предотвращения создания экземпляра сеанса. При определении его в качестве аргумента он автоматически создается.
@ M.Deinum Мне было интересно, хорошо или плохо включать идентификатор сеанса в тело ответа, поскольку он мне не нужен.
Очевидно, вам это нужно, иначе сеанс не будет создан.




Ваша текущая конфигурация (sessionCreationPolicy(SessionCreationPolicy.STATELESS)) гарантирует, что Spring-Security (и только Spring-Security)
Principal).Любой другой компонент вашего приложения (например, если вы будете использовать Spring-Session) все еще можно создать сеанс.
Верно ли, что любой запрос к другим ресурсам, кроме /login, будет аутентифицировать пользователя с помощью этого токена, а затем предоставить аутентифицированного пользователя в сеансе Spring?
Любой другой запрос, кроме /login, должен аутентифицировать пользователя на основе JWT. С вашей текущей конфигурацией principal не должен храниться в сеансе (это обеспечивается атрибутом stateless).
Тогда я все еще понятия не имею, откуда идет сеанс. Я внес правку, чтобы подтвердить, что сеанс введен. Помимо конфигурации безопасности и моей аутентификации JWT, это всего лишь простой запрос. Есть еще идеи?
Этот ответ помогает? stackoverflow.com/a/14510798/5022951
@Glains, вы исправили эту проблему? пожалуйста, поделитесь им. иметь такую же проблему
Попробуйте установить для сеанса значение 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 (SessionCreationPolicy.NEVER)
Даже с 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
в документе говорится НЕЗАВИСИМЫЙ Spring Security никогда не будет создавать HttpSession и никогда не будет использовать его для получения SecurityContext., который, я полагаю, переопределен порядком ваших лямбд. Но не спрашивайте меня о рабочем порядке: /