当前位置: 首页 > 知识库问答 >
问题:

从Angular调用启用Spring Security OAuth的服务器时发生CORS错误

公西运良
2023-03-14

我有一个Angular项目,它将发送一个带有值承载的标头Authoration

在其余部分,服务器运行Spring Boot Spring Security OAuth2ResourceServer。

我有一个安全配置类,它启用了Spring Security,它创建了默认的cors过滤器。

然而,我在运行的浏览器上发现了CORS错误http://localhost:4200.

所以我在SpringApplication类中创建了一个单独的CorsFilter豆。

@Bean
public CorsFilter getCorsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    config.setAllowedOriginPatterns(Arrays.asList("http://localhost:4200"));
    config.addAllowedHeader("*");
    config.addAllowedMethod("*");
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
}

我仍然在用户界面上看到CORS错误。

下面是Spring Security配置

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors()        
            .antMatcher("/api/**")
            .authorizeRequests()
            .antMatchers(HttpMethod.GET)
            .hasAnyAuthority("SCOPE_read", "SCOPE_profile", "ROLE_USER")
            .antMatchers(HttpMethod.POST)
            .hasAnyAuthority("SCOPE_read", "SCOPE_profile", "ROLE_USER")
                    .anyRequest().authenticated()
        .and()
          .oauth2ResourceServer()
            .jwt();
    }
}

共有2个答案

王俊楚
2023-03-14

首先添加“/oauth/Token”如下:

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers(HttpMethod.OPTIONS, "/oauth/token");
} 

然后设置过滤器:

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
@WebFilter("/*")
public class CorsFilter implements Filter {

    public CorsFilter() {
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        final HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization");
        response.setHeader("Access-Control-Max-Age", "3600");
        if ("OPTIONS".equalsIgnoreCase(((HttpServletRequest) req).getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
    }

    @Override
    public void destroy() {
    }

    @Override
    public void init(FilterConfig config) throws ServletException {
    }
}
鲁博瀚
2023-03-14

在分析了一天之后,想出了自定义默认的CorsFilter。

我定义的新鲜过滤豆未被spring security识别。因此,我必须自定义<code>http。cors()如下所示。

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {// @formatter:off
        http.cors(corsCustomiser())        
            .antMatcher("/api/**")
            .authorizeRequests()
            .antMatchers(HttpMethod.GET)
            .hasAnyAuthority("SCOPE_read", "SCOPE_profile", "ROLE_USER")
            .antMatchers(HttpMethod.POST)
            .hasAnyAuthority("SCOPE_read", "SCOPE_profile", "ROLE_USER")
                    .anyRequest().authenticated()
        .and()
          .oauth2ResourceServer()
            .jwt();
    }//@formatter:on

    private Customizer<CorsConfigurer<HttpSecurity>> corsCustomiser() {
        return new Customizer<CorsConfigurer<HttpSecurity>>() {
            @Override
            public void customize(CorsConfigurer<HttpSecurity> t) {
                t.configurationSource(getCorsConfiguration());              
            }           
        };
    }   
    
    private CorsConfigurationSource getCorsConfiguration() {    
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        config.setAllowedOriginPatterns(Arrays.asList("http://localhost:4200"));
        config.addAllowedHeader("*");
        config.addAllowedMethod("*");
        source.registerCorsConfiguration("/**", config);
        return source;
    }
}
 类似资料:
  • 我对Camunda很陌生,我想编写一个小的角程序,使用REST引擎控制已部署的BPMN流程。 到目前为止还不错,所以我从Camunda官方站点下载了开源社区平台。我还能够通过在上初始化的start-camunda.bat和TomCat启动所有内容。我的流程也被部署,我能够通过邮递员发出Rest电话来控制流程和获取信息。 所以REST通过邮递员工作打电话! Angular.json 如果我执行,它将

  • 你好,我是爱奥尼亚的新手。我想打电话给爱奥尼亚的邮政服务,但我总是遇到这个错误;"" 加载失败http://mywebservice.com/api:对飞行前请求的响应未通过访问控制检查:当请求的凭据模式为“包括”时,响应中的“访问控制允许原点”标头的值不得为通配符“*”。起源http://localhost:8100因此不允许访问。XMLHttpRequest发起的请求的凭据模式由withCre

  • 我刚刚安装了Ruby193和Ruby200,在创建了一个新的应用程序之后,我正在尝试加载服务器,但是我得到了下面的错误。 我用gem'sqlite3'替换了sqlite3 gem,'~ 有人知道怎么修吗? Gemfile是 Bundle Show提供捆绑包中包含的宝石: actionmailer(3.2.13) actionpack(3.2.13) activemodel(3.2.13) acti

  • 在React中通过fetch()调用API,但得到CORS错误。https://login.microsoftonline.com/tanent_id/oauth2/v2.0/authorize?client_id=xxxxxxxxxxxxxxxxxxxxxxx&response_type=code&redirect_uri=http://localhost:3050&scope=user.rea

  • 我目前正在使用Wink 1.1.1和Spring 3.1.2将Java应用程序从WAS 7迁移到WAS 8.5.5。我正在尝试使用WAS8.5中提供的本机Wink集成,而不是使用目前WAS7中单独的Wink jar。 我得到了一个错误的服务器启动,看起来像这样: 造成原因:java.io.FileNotFound异常:类路径资源[META-INF/server/wink-core-context.

  • 问题内容: 我正在尝试使用AJAX 调用功能,但无法获得适当的结果。我已经搜索了我的问题并找到了许多解决方案,但是这些解决方案对我没有用。请指导我我在做什么错。帮助将不胜感激。 干杯 程式码片段 后台代码文件中的方法 例外 问题答案: 首先,如果web方法在页面类中,而不在Web服务类中,则它应该是静态的。 其次,传输的数据实际上不是字符串,而是对象,因此将其更改为: 第三件事,“类型”用于旧版本