spring-security Spring添加了一个JSESSIONID,而不考虑无状态会话管理

siotufzp  于 2022-11-11  发布在  Spring
关注(0)|答案(5)|浏览(194)

我正在使用具有以下配置的Web应用程序的工作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
    }
}
ejk8hzay

ejk8hzay1#

您当前的配置(sessionCreationPolicy(SessionCreationPolicy.STATELESS))确保了Spring-Security(且仅Spring-Security

  • 将不创建会话
  • 不会依赖会话来提供身份验证详细信息(例如,提供Principal)。

您的应用程序的任何其他组件(例如,如果您要使用Spring-Session)仍然可以自由创建会话

vwoqyblh

vwoqyblh2#

尝试在应用程序中将会话设置为无。yml:

spring.session.store-type=none

如在以下文献中所提到的:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-session.html

8hhllhi2

8hhllhi23#

即使使用SessionCreationPolicy.STATELESS,会话仍然可以在spring安全范围之外创建。例如,当您调用request.getSession()或request.getSession(true)时,或者如果您访问一个会话作用域bean(spring内部将调用request.getSession(true))。
如果您将以下内容添加到application.properties,则每次创建会话时都会输出一个stacktrace,这可能有助于您了解发生了什么。

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

uyhoqukh4#

贷记至nils petersohn

sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER)

至少在Firefox中为我解决了这个问题。www.example.com中的spring.session.store-type=noneapplication.properties没有任何效果。

72qzrwbm

72qzrwbm5#

我也遇到了同样的问题。我发现HttpSession注入会创建一个会话(如果没有的话)。所以你必须自己获取会话,并确保在getSession()方法中使用false参数。所以试试这个:

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public void create() {
        ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
        HttpSession session = attr.getRequest().getSession(false); // do not create one
        if (session == null) {
            LOGGER.warn("Session is null.");
        } else {
            LOGGER.warn("Session id = {}", session.getId());
        }
}

相关问题