添加securityFilterChain后@PostMapping端点无法访问但@GetMapping正常
在Spring Boot整合Spring Security时,配置securityFilterChain后,AuthController中的@PostMapping("/auth/login")始终无法被命中,但@GetMapping("/auth/test")可以正常访问。已确认请求格式、请求头正确,且Security配置中已放行/auth/**路径,尝试多种排查步骤无果。
以下是针对性的排查思路与解决方法:
1. 关闭CSRF防护(最可能的根因)
Spring Security默认开启CSRF防护,会拦截POST/PUT/DELETE等非GET请求以验证CSRF令牌。由于你配置了SessionCreationPolicy.STATELESS无状态会话,无需CSRF防护,需显式关闭:
修改SecurityConfig中的securityFilterChain方法:
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .csrf(csrf -> csrf.disable()) // 关闭CSRF防护 .authorizeHttpRequests(req -> req.requestMatchers( "/auth/**", "/css/**.css", "/js/**" ).permitAll() .anyRequest().authenticated() ) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)); return http.build(); }
原因:未关闭CSRF时,POST请求因缺少CSRF令牌被Security过滤器拦截,无法到达控制器,且无明显错误日志输出。
2. 明确指定请求方法的放行规则
可在requestMatchers中明确指定POST方法的/auth/login路径,避免路径匹配规则的潜在歧义:
req.requestMatchers( "/auth/test", HttpMethod.POST, "/auth/login", "/css/**.css", "/js/**" ).permitAll()
3. 调整AuthRequest类的可见性
当前AuthRequest是AuthController内部的私有类,Jackson反序列化JSON请求体时可能无法访问该类,导致请求处理失败。将其改为public静态类:
@RestController @RequestMapping("/auth") public class AuthController { // ... 控制器方法 @Data @NoArgsConstructor public static class AuthRequest { // 修改为public static类 private String username; private String password; } }
4. 开启Security DEBUG日志排查
在application.properties中添加日志配置,查看Security过滤器链的执行细节,确认请求被拦截的具体环节:
logging.level.org.springframework.security=DEBUG
重启应用后重新发送POST请求,控制台日志会清晰展示请求是否被Security拦截、拦截的过滤器名称等关键信息。
内容的提问来源于stack exchange,提问作者BeingSuman

