在我的 Spring Security 3.1.0 应用程序中,我使用 Postman 成功访问了安全端点。已授予基本身份验证(用户名和密码)身份验证,允许我查看端点并在响应标头中接收 JSESSIONID cookie。
但是,后续尝试在不进行身份验证(无身份验证)且在请求标头中使用先前获取的 JSESSIONID cookie 访问同一端点时会失败。即使我包含了 JSESSIONID cookie,我也会收到 401 未经授权的错误。
预期的行为是当请求标头中提供 JSESSIONID cookie 时授予对安全端点的访问权限,指示之前已验证的会话。
请在下面找到我正在使用的SecurityConfiguration
@Configuration
@EnableWebSecurity(调试= true) 公共类 SecurityConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
}
@Bean
public UserDetailsService userDetailsService(PasswordEncoder passwordEncoder) {
return new CustomUserDetailService();
}
@Bean
public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration,
@Autowired UserDetailsService userDetailsService) throws Exception {
AuthenticationManagerBuilder managerBuilder = new AuthenticationManagerBuilder(Objects::requireNonNull);
managerBuilder.userDetailsService(userDetailsService);
return managerBuilder.build();
}
@Bean
public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests((requests) -> requests
.requestMatchers("/user/**").hasAnyRole("ADMIN")
.requestMatchers("/teams/**").hasAnyRole("USER"));
http.authorizeHttpRequests((requests) -> requests.anyRequest().permitAll());
http.formLogin(form -> form
.loginPage("/loginuser") // Set custom login page URL
.permitAll() // Allow access to the login page without authentication
.defaultSuccessUrl("/home") // Redirect to /home on successful login (optional)
);
http.httpBasic();
http.csrf().disable();
http.headers(h -> h.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable));
return (SecurityFilterChain) http.build();
}
}
您的 SecurityConfiguration 中发生了很多事情,您正在使用可以工作但已被弃用或在不久的将来将被弃用的配置方法。我强烈建议您查看当前的 Spring Security 文档,这应该是 3.1.0 的正确文档:https://docs.spring.io/spring-security/reference/6.0/index.html
无论如何,要显式启用 Spring 将 Session 发布到 WebApplicationContext,您需要添加以下 bean:
@Bean
public HttpSessionEventPublisher httpSessionEventPublisher() {
return new HttpSessionEventPublisher();
}