SpringBoot 3.2.5集成JWT认证遇403错误求助(MySQL)
解决Spring Boot + JWT 所有请求返回403的问题
问题排查与修复方案
1. 缺失CORS配置导致跨域拦截
你的SecurityConfiguration导入了CORS相关类,但未配置CORS源并启用CORS,前端跨域请求会被Spring Security拦截返回403。
修复代码:在SecurityConfiguration中添加CORS配置Bean,并在HttpSecurity中启用CORS:
@Bean public CorsConfigurationSource corsConfigurationSource() { CorsConfiguration configuration = new CorsConfiguration(); configuration.setAllowedOrigins(List.of("*")); // 生产环境替换为具体可信域名 configuration.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE", "OPTIONS")); configuration.setAllowedHeaders(List.of("*")); configuration.setAllowCredentials(true); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", configuration); return source; }
更新securityFilterChain方法:
@Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .cors(cors -> cors.configurationSource(corsConfigurationSource())) // 启用CORS .authorizeHttpRequests(auth -> auth .requestMatchers("/login", "/user-add").permitAll() .anyRequest().authenticated()) .csrf(AbstractHttpConfigurer::disable) .addFilterBefore(jwtAuthenticationFilter, UsernamePasswordAuthenticationFilter.class) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)); return http.build(); }
2. User实体未正确实现UserDetails接口
CustomeruserDetailsService直接将User强转为UserDetails,但如果User类未完整实现UserDetails接口的方法,会导致认证流程异常,甚至影响permitAll接口的正常访问。
修复代码:确保User实体实现UserDetails接口:
import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import jakarta.persistence.*; import java.util.Collection; import java.util.Collections; @Entity @Table(name = "users") public class User implements UserDetails { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String password; // 其他业务字段 // 实现UserDetails接口方法 @Override public Collection<? extends GrantedAuthority> getAuthorities() { // 暂未启用角色,返回空集合即可 return Collections.emptyList(); } @Override public String getPassword() { return password; } @Override public String getUsername() { return username; } @Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { return true; } // 生成getter、setter及构造方法 }
3. JWT密钥长度不符合算法要求
你的jwtSecret为"mangadownload"(仅12字符),而HS256算法要求密钥长度至少256位(32字符),这会导致JWT生成与验证失败,进而触发403。
修复方法:替换为足够长度的安全密钥,例如:
private final String jwtSecret = "a32characterlongsecuresecretkeyforjwtauth";
4. 可选:显式指定请求匹配的HTTP方法
如果/login和/user-add仅处理POST请求,显式指定方法可避免意外匹配其他请求类型:
import org.springframework.http.HttpMethod; // 在securityFilterChain的authorizeHttpRequests中修改 .authorizeHttpRequests(auth -> auth .requestMatchers(HttpMethod.POST, "/login", "/user-add").permitAll() .anyRequest().authenticated())
验证步骤
- 启动应用后,先测试
/user-add接口,确认能正常创建用户 - 调用
/login接口获取JWT Token - 在请求头中添加
Authorization: Bearer {token},访问需认证的接口,确认响应正常
内容的提问来源于stack exchange,提问作者Abhinav Karn
相关产品推荐
相关产品推荐

