Spring Security拦截表单提交,Spring JPA无法保存用户数据
解决方案:Spring Security拦截注册请求问题
关键问题定位
从日志可见POST /buyer/registerNewBuyer被拦截并重定向到登录页,结合配置分析出核心问题:
- 未放行注册提交端点:表单提交的目标路径
/buyer/registerNewBuyer未加入permitAll的请求匹配列表,Spring Security默认拦截所有未放行请求。 - 无状态会话与表单登录冲突:启用了
SessionCreationPolicy.STATELESS无状态会话,但表单登录依赖Session维护认证状态,两者冲突导致认证流程异常。 - 冗余CSRF配置:重复设置两次CSRF Token仓库,属于无效冗余代码。
修改后的SecurityFilterChain配置
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http // 保留一次CSRF配置即可 .csrf((csrf) -> csrf .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())) .authorizeHttpRequests((requests) -> requests // 新增放行注册提交的端点 .requestMatchers("/", "/login", "/signup", "/buyer/buyer-registration", "/buyer/registerNewBuyer", "/buyer/buyer-reg-success", "/buyer/buyer-reg-error", "/registration-error").permitAll() .requestMatchers("/edit", "/delete").authenticated() .anyRequest().authenticated()) .formLogin((form) -> form .loginPage("/login") .defaultSuccessUrl("/home", true) .failureUrl("/login?error=true") .permitAll()) .logout((logout) -> logout .logoutSuccessUrl("/") .permitAll()) // 移除无状态会话配置,表单登录需要Session支持 // .sessionManagement((session) -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authenticationProvider(authenticationProvider) .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class); return http.build(); }
额外验证步骤
- 检查CSRF Token:查看注册页面HTML源码,确认是否存在
_csrf隐藏字段(Thymeleaf会自动为POST表单注入),若缺失需检查Thymeleaf命名空间和配置。 - JWT过滤器校验:确保
jwtAuthFilter不会拦截/buyer/registerNewBuyer等匿名端点,可在过滤器中添加路径判断跳过这些请求。
内容的提问来源于stack exchange,提问作者Winston Oge
相关产品推荐
相关产品推荐

