You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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())

验证步骤

  1. 启动应用后,先测试/user-add接口,确认能正常创建用户
  2. 调用/login接口获取JWT Token
  3. 在请求头中添加Authorization: Bearer {token},访问需认证的接口,确认响应正常

内容的提问来源于stack exchange,提问作者Abhinav Karn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:53:16