Spring Boot中CORS禁用无效及权限配置异常问题
问题排查与解决方案
跨域请求401(Angular端)
你用.cors(AbstractHttpConfigurer::disable)禁用了Spring Security的CORS,但浏览器跨域时会先发OPTIONS预检请求,这个请求大概率被Spring Security拦截了——Postman和Swagger不会自动发预检请求,所以能正常访问。Referrer Policy只是浏览器安全提示,不是报错根源。
修复方案:
配置合法的CORS规则,不要直接禁用:
新增CORS配置Bean:@Bean CorsConfigurationSource corsConfigurationSource() { CorsConfiguration config = new CorsConfiguration(); config.setAllowedOrigins(List.of("http://localhost:4200")); // 替换成你的Angular实际地址 config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS")); config.setAllowedHeaders(List.of("*")); config.setAllowCredentials(true); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); return source; }然后在SecurityFilterChain里启用CORS:
httpSecurity.cors(cors -> cors.configurationSource(corsConfigurationSource()))强制放行OPTIONS预检请求:
在权限配置里加一条规则:.authorizeHttpRequests(authorize -> authorize .requestMatchers(HttpMethod.OPTIONS, "/**").permitAll() // 让预检请求直接通过 .requestMatchers(SECURED_URLS).hasAuthority("ROLE_realm_user") .requestMatchers(SWAGGER_UI_URLS).permitAll() .anyRequest().authenticated() )
URL权限控制失效问题
改完URL后请求被无权限放行,说明你的URL匹配规则没生效,原因可能有两个:
- 用
OrRequestMatcher包裹单个匹配器完全多余,反而可能导致匹配逻辑异常; - 请求的实际URL和配置的规则不匹配(比如有没有上下文路径、大小写错误)。
修复方案:
- 简化SECURED_URLS的定义:
private static final RequestMatcher SECURED_URLS = AntPathRequestMatcher.antMatcher(HttpMethod.GET, "/api1/mySecuredURL1/**"); - 核对实际请求路径:如果你的应用有上下文路径(比如
/my-app),规则要改成/my-app/api1/mySecuredURL1/**,或者用ServletUriComponentsBuilder.fromCurrentRequest().toUriString()打印实际请求路径验证。
角色转换器的验证建议
虽然当前问题可能不在转换器,但要确认ROLE_realm_user是否被正确提取:
- 检查JWT的
realm_access.roles字段里有没有user角色(转换器会给它加ROLE_realm_前缀,最终生成ROLE_realm_user权限); - 可以在转换器的
convert方法末尾加一行日志,打印提取到的权限:System.out.println("提取到的权限:" + grantedAuthorities);
验证步骤
- 后端启动后用Postman测
/api1/mySecuredURL1/**:- 不带JWT:返回401
- 带含
userrealm角色的JWT:正常返回数据 - 带无权限的JWT:返回403
- 测Angular跨域请求:
- 确保请求头带
Authorization: Bearer <你的JWT> - 看浏览器Network面板,确认OPTIONS请求返回200,后续GET请求带JWT并正常响应
- 确保请求头带
内容的提问来源于stack exchange,提问作者Hayk Mkhitaryan
相关产品推荐
相关产品推荐

