Summary
GitHub code scanning has reported a high-risk vulnerability titled "Disabled Spring CSRF protection". After I made the configuration change from .csrf(csrf -> csrf.disable()) to .csrf(csrf -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())) and submitted it to GitHub, the problem was resolved. Initially, I didn't encounter any authentication issues while logged in. However, after logging out and trying to access "/login", I received a status code 401. I have already configured .requestMatchers("/login").permitAll(). Could you please advise me on how to resolve this issue?
Expected Behavior
After configuring .requestMatchers("/login").permitAll(), a status code 401 error should not occur.
Configuration
package com.tang.framework.config;
import java.util.List;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.ProviderManager;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
import org.springframework.security.web.csrf.CookieCsrfTokenRepository;
import com.tang.framework.security.filter.JwtAuthenticationTokenFilter;
import static org.springframework.security.config.Customizer.withDefaults;
/**
* Spring Security 配置
*
* @author Tang
*/
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity, AuthenticationEntryPoint authenticationEntryPoint,
JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter, LogoutSuccessHandler logoutSuccessHandler) throws Exception {
return httpSecurity
// 禁用 CSRF
.csrf(csrf -> csrf.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()))
// 启用 CORS
.cors(withDefaults())
// 设置 session 管理器为无状态
.sessionManagement(management -> management.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
// 设置未登陆过滤器
.exceptionHandling(handling -> handling.authenticationEntryPoint(authenticationEntryPoint))
.authorizeHttpRequests(authorize -> authorize
.requestMatchers("/login").permitAll()
.requestMatchers("/v3/api-docs/**", "/swagger-ui/**", "/swagger-ui.html").permitAll()
.requestMatchers("/websocket/**").permitAll()
.requestMatchers("/uploads/**").permitAll()
.anyRequest().authenticated()
)
.logout(logout -> logout.logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler))
.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class)
.build();
}
@Bean
public AuthenticationManager authenticationManager(AuthenticationProvider usernameAuthenticationProvider, AuthenticationProvider emailAuthenticationProvider) {
var providers = List.of(usernameAuthenticationProvider, emailAuthenticationProvider);
return new ProviderManager(providers);
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
Version
Spring Boot v3.1.3
Sample
Repository: https://github.com/tangllty/tang-boot/
Security config: https://github.com/tangllty/tang-boot/blob/master/tang-framework/src/main/java/com/tang/framework/config/SecurityConfig.java
Comment From: sjohnr
@tangllty, thanks for getting in touch, but it feels like this is a question that would be better suited to Stack Overflow. We prefer to use GitHub issues only for bugs and enhancements. Feel free to update this issue with a link to the re-posted question (so that other people can find it).
Having said that, you are most likely dealing with a CSRF-related problem. I recommend doing some research on integrating JavaScript applications with CSRF-protected backends. You can start by reviewing the CSRF overview and the recently updated CSRF reference in the docs which contains a section on JavaScript applications.