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

Spring Security+React登录成功后无法访问Rest端点问题

问题分析

你手动实现的/login接口仅完成了凭证验证,但没有将认证成功的Authentication对象存入Spring Security的SecurityContext,导致后续请求无法识别用户已登录状态。Spring Security默认通过SecurityContextHolder跟踪当前用户的认证信息,你的代码缺少这关键一步。

修复步骤

1. 修改登录控制器,保存认证信息

在登录成功后,将Authentication对象存入SecurityContext,绑定到当前会话:

@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody RegisterUser registerUser) {
    try {
        Authentication authentication = authenticationManager.authenticate(
                new UsernamePasswordAuthenticationToken(registerUser.getEmail(), registerUser.getPassword())
        );
        // 关键:将认证信息存入SecurityContext
        SecurityContextHolder.getContext().setAuthentication(authentication);
        if (authentication.isAuthenticated()) {
            return ResponseEntity.ok().body("Login successful");
        } else {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Login failed");
        }
    } catch (AuthenticationException e) {
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Login failed");
    }
}

2. 配置CORS(跨域场景必加)

由于前端React和后端Spring Boot运行在不同端口,需要配置CORS允许携带凭证(withCredentials=true),否则会话Cookie无法在跨域请求中传递:

@Bean
public CorsFilter corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    // 替换为你的前端实际域名/端口
    config.addAllowedOrigin("http://localhost:3000");
    config.addAllowedHeader("*");
    config.addAllowedMethod("*");
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
}

3. 优化SecurityFilterChain配置(可选)

明确会话Cookie的属性,适配跨域场景:

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    return http
            .authorizeHttpRequests(auth->auth
                    .requestMatchers("/","/login","/register")
                    .permitAll()
                    .anyRequest()
                    .authenticated())
            .logout(logout->logout
                    .logoutUrl("/logout")
                    .logoutSuccessUrl("/")
                    .deleteCookies("JSESSIONID")
                    .invalidateHttpSession(true))
            .csrf(AbstractHttpConfigurer::disable)
            .sessionManagement(session->session
                    .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
                    // 配置会话Cookie的SameSite属性,适配跨域
                    .sessionCookieConfig(cookie -> cookie.sameSite(SameSiteEnum.LAX)))
            .build();
}
验证要点
  • 登录成功后,检查浏览器是否收到JSESSIONID Cookie
  • 后续请求时,确认axios自动携带了该Cookie(可在浏览器开发者工具的Network标签查看请求头)
  • 访问受保护端点时,Spring Security会通过Cookie中的会话ID找到对应的SecurityContext,识别用户身份

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 14:05:06