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

Spring Boot中CORS禁用无效及权限配置异常问题

问题排查与解决方案

跨域请求401(Angular端)

你用.cors(AbstractHttpConfigurer::disable)禁用了Spring Security的CORS,但浏览器跨域时会先发OPTIONS预检请求,这个请求大概率被Spring Security拦截了——Postman和Swagger不会自动发预检请求,所以能正常访问。Referrer Policy只是浏览器安全提示,不是报错根源。

修复方案:

  1. 配置合法的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()))
    
  2. 强制放行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和配置的规则不匹配(比如有没有上下文路径、大小写错误)。

修复方案:

  1. 简化SECURED_URLS的定义:
    private static final RequestMatcher SECURED_URLS = AntPathRequestMatcher.antMatcher(HttpMethod.GET, "/api1/mySecuredURL1/**");
    
  2. 核对实际请求路径:如果你的应用有上下文路径(比如/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);
    

验证步骤

  1. 后端启动后用Postman测/api1/mySecuredURL1/**:
    • 不带JWT:返回401
    • 带含user realm角色的JWT:正常返回数据
    • 带无权限的JWT:返回403
  2. 测Angular跨域请求:
    • 确保请求头带Authorization: Bearer <你的JWT>
    • 看浏览器Network面板,确认OPTIONS请求返回200,后续GET请求带JWT并正常响应

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:10:35