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(); }
验证要点
- 登录成功后,检查浏览器是否收到
JSESSIONIDCookie - 后续请求时,确认axios自动携带了该Cookie(可在浏览器开发者工具的Network标签查看请求头)
- 访问受保护端点时,Spring Security会通过Cookie中的会话ID找到对应的SecurityContext,识别用户身份
内容的提问来源于stack exchange,提问作者Pretham
相关产品推荐
相关产品推荐

