我正在使用具有以下配置的 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 不会自行创建 session 。但是,如果我访问 /login
以外的任何其他资源,我仍然会在响应 header 中看到以下条目:
set-cookie: JSESSIONID=...; Path=/; HttpOnly
有人可以解释这是从哪里来的(也许不是来自 Spring),如果它仍然来自 Spring 需要更改什么?
编辑:
在我的 Controller 中进行测试, session 仍然按照存在的上述标记指示注入(inject)。我仍然不知道这是从哪里来的。
@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public void create(HttpSession session) {
if (session != null) {
System.out.println("Session is existing"); // executes
}
}
最佳答案
您当前的配置 (sessionCreationPolicy(SessionCreationPolicy.STATELESS)
) 确保 Spring-Security(并且仅 Spring-Security)
- 不会创建 session
- 不会依赖 session 来提供身份验证详细信息(例如,提供
Principal
)。
您的应用程序的任何其他组件(例如,如果您使用 Spring-Session)仍然可以免费创建 session 。
关于java - 尽管无状态 session 管理,Spring 还是添加了一个 JSESSIONID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52573539/