Spring 4/5 глобальная конфигурация CORS не работает, если в запрошенном ресурсе присутствует заголовок "Нет" Access-Control-Allow-Origin '

77
7

Я пытаюсь войти через http://localhost:3000 используя HTTP POST.

Я получаю следующее:

XMLHttpRequest не может загрузить http://localhost: 8080/api/auth/login. В запрошенном ресурсе нет заголовка "Access-Control-Allow-Origin". Поэтому исходный адрес http://localhost: 3000 'не допускается.

Я настроил приложение Spring 5.0.0.M4 и Spring-Security 4.2.1.RELEASE следующим образом:

@SpringBootApplication
public class SpringBootApp extends WebMvcConfigurerAdapter {

private boolean workOffline = true;
private boolean setupSchema = false;
private IGraphService graphService;
private DbC conf;

@Autowired
public SpringBootApp(IGraphService graphService, DbC conf)
{
this.graphService = graphService;
this.conf = conf;
}

public static void main(String[] args) throws Exception {
SpringApplication.run(SpringBootApp.class, args);
}

@Bean
public Filter caseInsensitiveRequestFilter() {
return new CaseInsensitiveRequestFilter();
}

@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}

@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:3000")
.allowedMethods("GET", "PUT", "POST", "DELETE","OPTIONS");
}

@Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("http://localhost:3000");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
bean.setOrder(0);
return bean;
}
}

Я не понимаю, почему глобальная конфигурация CORS не работает, даже если она настроена правильно.

Я подключил консольные и сетевые вкладки:

console tab network tab

спросил(а) 2021-01-19T14:38:47+03:00 6 месяцев назад
1
Решение
133

С помощью dur. Я заметил, что http://github.com/svlada/springboot-security-jwt добавил WebSecurityConfig, который переопределял мою конфигурацию приложения Spring Boot.

В разделе конфигурации WebSecurityConfig я добавил WebSecurityConfig() раньше всего:

    @Override
protected void configure(HttpSecurity http) throws Exception {
http.cors()
.and()
.csrf().disable() // We don't need CSRF for JWT based authentication
.exceptionHandling()
.authenticationEntryPoint(this.authenticationEntryPoint)

.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)

.and()
.authorizeRequests()
.antMatchers(FORM_BASED_LOGIN_ENTRY_POINT).permitAll() // Login end-point
.antMatchers(TOKEN_REFRESH_ENTRY_POINT).permitAll() // Token refresh end-point
.antMatchers("/console").permitAll() // H2 Console Dash-board - only for testing
.and()
.authorizeRequests()
.antMatchers(TOKEN_BASED_AUTH_ENTRY_POINT).authenticated() // Protected API End-points
.and()
.addFilterBefore(buildAjaxLoginProcessingFilter(), UsernamePasswordAuthenticationFilter.class)
.addFilterBefore(buildJwtTokenAuthenticationProcessingFilter(), UsernamePasswordAuthenticationFilter.class);
}

Затем я получил ошибку для corsFilter. Боб должен быть типа CorsFilter но для меня это был FilterRegistrationBean.

Поэтому я преобразовал Bean в свой класс @SpringBootApplication из

    @Bean
public FilterRegistrationBean corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("http://localhost:3000");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
bean.setOrder(0);
return bean;
}

чтобы:

    @Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
config.addAllowedOrigin("http://localhost:3000");
config.addAllowedHeader("*");
config.addAllowedMethod("*");
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}

Я также удалил

  @Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:3000")
.allowedMethods("GET", "PUT", "POST", "DELETE","OPTIONS");
}

Мне, возможно, придется переместить эти конфигурации в одно место - выгодно удалить WebSecurityConfig вообще

ответил(а) 2021-01-19T14:38:47+03:00 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема