Spring Security集成Cors无法生效问题求助
Spring Security集成CORS失效求助
已耗时16小时尝试解决Spring Security集成CORS无法生效的问题仍未成功,特向大家求助。
WebSecurityConfig配置
@Configuration @EnableMethodSecurity public class WebSecurityConfig { @Autowired UserDetailsServiceImpl userDetailsService; @Autowired private AuthEntryPointJwt unauthorizedHandler; @Bean public AuthTokenFilter authenticationJwtTokenFilter() { return new AuthTokenFilter(); } @Bean public DaoAuthenticationProvider authenticationProvider() { DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); authProvider.setUserDetailsService(userDetailsService); authProvider.setPasswordEncoder(passwordEncoder()); return authProvider; } @Bean public AuthenticationManager authenticationManager(AuthenticationConfiguration authConfig) throws Exception { return authConfig.getAuthenticationManager(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.addAllowedOrigin("*"); // 允许所有来源访问 config.addAllowedHeader("*"); config.addAllowedMethod("*"); source.registerCorsConfiguration("/**", config); // 应用到所有路径 FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source)); bean.setOrder(Ordered.HIGHEST_PRECEDENCE); return new CorsFilter(source); } @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.addFilterBefore(corsFilter(), ChannelProcessingFilter.class) .addFilterBefore(authenticationJwtTokenFilter(), UsernamePasswordAuthenticationFilter.class) .csrf(csrf -> csrf.disable()) .exceptionHandling(exception -> exception.authenticationEntryPoint(unauthorizedHandler)) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(auth -> auth.requestMatchers("/api/auth/**").permitAll().requestMatchers("/api/health/**") .permitAll().requestMatchers("/actuator/**").permitAll().anyRequest().authenticated()) .authenticationProvider(authenticationProvider()); http.cors(Customizer.withDefaults()); return http.build(); } }
AuthController相关代码
@RestController @RequestMapping("/api/auth") public class AuthController { @Autowired AuthenticationManager authenticationManager; @Autowired UserRepository userRepository; @Autowired RoleRepository roleRepository; @Autowired PasswordEncoder encoder; @Autowired JwtUtils jwtUtils; @Autowired private SequenceGeneratorService generatorService; @PostMapping("/signin") public ResponseEntity<?> authenticateUser(@Valid @RequestBody LoginRequest loginRequest) { Authentication authentication = authenticationManager.authenticate( new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword())); SecurityContextHolder.getContext().setAuthentication(authentication); String jwt = jwtUtils.generateJwtToken(authentication); UserDetailsImpl userDetails = (UserDetailsImpl) authentication.getPrincipal(); List<String> roles = userDetails.getAuthorities().stream() .map(item -> item.getAuthority()) .collect(Collectors.toList()); return ResponseEntity.ok(new JwtResponse(jwt, userDetails.getId(), userDetails.getUsername(), userDetails.getEmail(), roles)); } // [REDACTED] }
问题推测与已尝试方案
推测问题在于Spring Security优先校验CORS,导致自定义的CorsFilter无法被请求触发。目前已尝试以下方案均无效:
- 在方法或类级别定义
@CrossOrigin - 定义独立的CorsConfig类
- 在WebSecurityConfig中添加各类CorsFilter、CorsSource相关配置
恳请各位指点解决方向或提供可行方案。
内容的提问来源于stack exchange,提问作者Ben Coepp
相关产品推荐
相关产品推荐

