Запрос перед полетом проходит проверку подлинности, даже если CorsFilter включен в Spring Boot - PullRequest
0 голосов
/ 25 октября 2019

Я использую Spring Security для аутентификации OAuth и настроил Cors. Тем не менее, мой предварительный запрос не проходит из-за аутентификации, так как предварительный запрос не имеет токена (так и должно быть). У меня есть следующий класс конфигурации:

SecurityConfiguration.java

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(final HttpSecurity security) throws Exception {

        security.cors()
                .and()
                .requestMatchers()
                .antMatchers("/actuator/health")
                .and()
                .authorizeRequests()
                .antMatchers("/actuator/health").permitAll()
                .and()
                .csrf().disable();

        // Custom filter to validate if user is authorized and active to access the system
        security.addFilterAfter(new AuthorizationFilter(), BasicAuthenticationFilter.class);
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration().applyPermitDefaultValues();
        configuration.setAllowedMethods(Arrays.asList("GET","HEAD","POST","PUT"));
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

WebMvcConfiguration .java

@Configuration
public; class WebMvcConfiguration implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedMethods("GET","HEAD","POST","PUT");
    }
}

Вопросы:

  1. Почему предварительный запрос отправляется на проверку подлинности, даже если у меня включен CorsFilter?
  2. Как можно исключить предварительный запрос для проверки подлинности?

ОБНОВЛЕНИЕ:

Я включил журнал для отладки проблемы, используя logging.level.org.springframework.security.web.FilterChainProxy: DEBUG в файле application.yml.

Я получил списокФильтр зарегистрирован в цепочке фильтров и список выглядит следующим образом:

class org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter
class org.springframework.security.web.context.SecurityContextPersistenceFilter
class org.springframework.security.web.header.HeaderWriterFilter
class org.springframework.web.filter.CorsFilter
class org.springframework.security.web.authentication.logout.LogoutFilter
class org.springframework.security.web.savedrequest.RequestCacheAwareFilter
class org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter
class org.springframework.security.web.authentication.AnonymousAuthenticationFilter
class org.springframework.security.web.session.SessionManagementFilter
class org.springframework.security.web.access.ExceptionTranslationFilter
class org.springframework.security.web.access.intercept.FilterSecurityInterceptor
class org.springframework.security.oauth2.server.resource.web.BearerTokenAuthenticationFilter

Обратите внимание, что corsFilter зарегистрирован. Однако, когда я получаю запрос, работают только следующие фильтры, а не CorsFilter;

'WebAsyncManagerIntegrationFilter'
'SecurityContextPersistenceFilter'
'HeaderWriterFilter'
'LogoutFilter'
'BearerTokenAuthenticationFilter'
'RequestCacheAwareFilter'
'SecurityContextHolderAwareRequestFilter'
'AnonymousAuthenticationFilter'
'SessionManagementFilter'
'ExceptionTranslationFilter'
'FilterSecurityInterceptor'

ОБНОВЛЕНИЕ 2:

Во время тестирования я заметил для '/ привод / здоровье', CorsFilter вызывается. Но я не уверен, что это значит?

1 Ответ

0 голосов
/ 25 октября 2019

Добавление следующего в вашу конфигурацию security.cors() должен был включить фильтр CORS, который должен позволить предполетному запросу работать без маркера авторизации. Но, похоже, вы неправильно настроили свои запросы на макросы, пожалуйста, используйте правильные отображения URL, чтобычто конфигурация безопасности будет применяться ко всем конечным точкам.

Кроме того, попробуйте установить допустимые источники, чтобы охватить все источники:

@Bean
CorsConfigurationSource corsConfigurationSource() {
    CorsConfiguration configuration = new CorsConfiguration().applyPermitDefaultValues();
    configuration.setAllowedMethods(Arrays.asList("GET","HEAD","POST","PUT"));
    configuration.setAllowedOrigins(Arrays.asList("*"));
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
}

Руководство: https://www.baeldung.com/spring-security-multiple-entry-points

...