我正在使用以下配置对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
}
}
答案 0 :(得分:2)
您当前的配置(@clicked="changeStatus($event)"
)确保Spring-Security(并且只有Spring-Security )
sessionCreationPolicy(SessionCreationPolicy.STATELESS)
)。应用程序的任何其他组件(例如,如果您将使用Spring-Session)仍然可以自由创建会话。
答案 1 :(得分:0)
尝试在application.yml中将会话设置为无。
spring.session.store-type=none
如文档中所述:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-session.html
答案 2 :(得分:0)
即使使用 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