春季启动CORS配置

Posted

技术标签:

【中文标题】春季启动CORS配置【英文标题】:Spring boot CORS configuration 【发布时间】:2019-01-09 03:29:36 【问题描述】:

我有 Spring Boot Rest 应用程序。 最近我使用 JsonWebToken 实现了用户认证。

当我使用邮递员对其进行测试时,一切似乎都运行良好, 但是当从 Angular 应用程序调用其余部分时,我得到了错误 引用cors:

对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此,Origin 'http://localhost:4200' 不允许访问。响应的 HTTP 状态代码为 403。

这是我的代码:

@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter 

@Autowired
private JwtAuthFilter authFilter;

@Autowired
private JwtAuthenticationProvider authenticationProvider;

@Autowired
private JwtAuthenticationEntryPoint authenticationEntryPoint;

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception 
    auth.authenticationProvider(authenticationProvider);


@Override
protected void configure(HttpSecurity http) throws Exception 
    //http.csrf().ignoringAntMatchers("/token");
    http.csrf().disable();

    http.cors().and().authorizeRequests()
            .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
            .antMatchers("/token").permitAll()
            .antMatchers("/rest/**").authenticated()
            .and()
            .addFilterBefore(authFilter, UsernamePasswordAuthenticationFilter.class)
            .exceptionHandling()
            .authenticationEntryPoint(authenticationEntryPoint);




@Bean
CorsConfigurationSource corsConfigurationSource() 
    CorsConfiguration configuration = new CorsConfiguration();
    configuration.setAllowedOrigins(Arrays.asList("*"));
    configuration.setAllowedMethods(Arrays.asList("GET","POST","OPTIONS","PUT","DELETE"));
    configuration.setAllowCredentials(true);
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/rest/**", configuration);
    return source;




JwtAuthFilter:

@Component
public class JwtAuthFilter implements Filter


@Override
public void doFilter(ServletRequest request, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException

    HttpServletRequest servletRequest = (HttpServletRequest) request;
    HttpServletResponse response = (HttpServletResponse) servletResponse;

    String authorization = servletRequest.getHeader("Authorization");
    String origin = servletRequest.getHeader("Origin");

    if (authorization != null)
    
        JwtAuthToken token = new JwtAuthToken(authorization.replaceAll("Bearer ", ""));
        SecurityContextHolder.getContext().setAuthentication(token);
    

    filterChain.doFilter(servletRequest, response);


@Override
public void destroy()




@Override
public void init(FilterConfig filterConfig) throws ServletException




我的登录Controller有一个映射“/token”,其他所有控制器都映射为“/rest/**” 有趣的是,调用“/token”控制器工作正常……它返回令牌和用户详细信息。服务器响应包含:

访问控制允许凭据 →true 访问控制允许来源→http://localhost:4200

但是当我调用任何其他控制器时......例如“/rest/task/all”我收到错误并且没有 access-control-allow-credentials 和 access-control-allow-origin 标头。

当我改变时

source.registerCorsConfiguration("/rest/**", configuration);

source.registerCorsConfiguration("/**", configuration);

我收到错误消息,我在 access-control-allow-origin 标头中有两个值 http://localhost:4200 和 http://localhost:4200

任何人都可以提供任何帮助:D?

【问题讨论】:

【参考方案1】:

这是一个老问题,我不确定您是否找到了答案。我只能建议调试这些问题的方法,因为这些问题通常非常容易设置。

1.First - 仅 Java 代码不足以调试 CORS 问题。您需要查看浏览器网络选项卡并查看哪个调用失败 - OPTIONS 调用或实际数据调用。其次,在浏览器中,需要仔细查看请求和响应标头是否有失败的请求,并且需要列出这些标头。下面这些。

在请求方面 - Origin

在响应方面 - Access-Control-Allow-CredentialsAccess-Control-Allow-HeadersAccess-Control-Allow-MethodsAccess-Control-Allow-Origin

2.

当我使用邮递员对其进行测试时,一切似乎都运行良好,但是当 其余部分是从 Angular 应用程序调用的,我遇到了错误 核心:

这是正常行为,因为 CORS 是一种浏览器安全功能,您可能不会在任何其他客户端中看到此问题。 CORS 错误并不意味着您的 API 调用没有成功,它只意味着浏览器正在抑制响应而不是继续前进。

因此,如果您的 API 使用者不是网络浏览器,那么您很可能在 API 方面与 CORS 无关。其他客户端不会通过包含OPTIONS 请求使其成为两步过程。

3.Configuration 行 - http.cors() 将添加过滤器 - org.springframework.web.filter.CorsFilter 到您的过滤器链中,因此在您的 JwtAuthFilter 中放置断点以查看代码流向何处。

4. url 的系统行为预计会有所不同 - /token/rest/** 因为令牌 url 不安全,而 rest/** 仅允许经过身份验证的用户使用,因此会出现额外的过滤器。

Spring Security exclude url patterns in security annotation configurartion

How to disable spring security for particular url

因此,查找 CORS 问题的理想方法是通过接收有问题的请求并验证响应标头 - Access-Control-Allow-Origin 已正确填充来调试您的代码。

【讨论】:

以上是关于春季启动CORS配置的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot CORS 通过配置启用

Spring Boot CORS 通过配置启用

春季启动MongoDB配置

春季启动外部配置

春季启动的 logging.config 配置

何时为春季启动执行指定多个配置文件