Spring Security 5, в ресурсе нет заголовка «Контроль доступа разрешить источник» - PullRequest
0 голосов
/ 29 мая 2020

У меня есть следующий класс конфигурации, который реализует интерфейс WebMvcConfigurer и переопределяет метод addCorsMappings. (как описано здесь: https://www.baeldung.com/spring-cors)

@Configuration
//@EnableWebMvc <- I tried with and without, no effect
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**");
    }
}

У меня также есть класс конфигурации, расширяющий WebSecurityConfigurerAdapter:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Autowired
    private CustomUserDetailsService customService = new CustomUserDetailsService();


    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http            
            .cors().and()
            .csrf().disable()
            .authorizeRequests()
            .antMatchers("/user/signup*").permitAll()
            .and()
            .authorizeRequests()
            .antMatchers("/auth*").permitAll()
            .and()
            .authorizeRequests()
            .antMatchers("/nummern/**").permitAll()
            .and()
            .authorizeRequests()
            .antMatchers("/information/").hasRole("OWNER")
            .and()
            .authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .addFilter(new JwtAuthenticationFilter(authenticationManager()))
            .addFilter(new JwtAuthorizationFilter(authenticationManager()))
            .sessionManagement()
            .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }
}

Каждый раз, когда я делаю HTTP-запрос на моя конечная точка авторизации, используя Ajax, я получаю следующую ошибку:

Доступ к XMLHttpRequest в 'http://localhost: 8080 / auth? username = Example & password = Example ' from origin 'http://localhost: 3000 'заблокировано политикой CORS: в запрошенном ресурсе отсутствует заголовок' Access-Control-Allow-Origin '.

Поскольку этот подход не дал результата, я также попробовал подход, описанный в документации Spring Security 5, но это тоже не сработало:

https://docs.spring.io/spring-security/site/docs/5.0.5.RELEASE/reference/htmlsingle/#cors

Я не уверен, что это связано с моим Конфигурация CORS или некоторая конфигурация CSRF (насколько мне известно, CSRF должен быть отключен из-за моей конфигурации HttpSecurity):

2020-05-29 13:52:40.377 DEBUG 21056 --- [nio-8080-exec-1] o.s.security.web.FilterChainProxy        : /auth?username=Example&password=Example at position 3 of 15 in additional filter chain; firing Filter: 'HeaderWriterFilter'
2020-05-29 13:52:40.378 DEBUG 21056 --- [nio-8080-exec-1] o.s.security.web.FilterChainProxy        : /auth?username=Example&password=Example at position 4 of 15 in additional filter chain; firing Filter: 'CsrfFilter'
2020-05-29 13:52:40.381 DEBUG 21056 --- [nio-8080-exec-1] o.s.security.web.csrf.CsrfFilter         : Invalid CSRF token found for http://localhost:8080/auth?username=Example&password=Example
2020-05-29 13:52:40.382 DEBUG 21056 --- [nio-8080-exec-1] o.s.s.w.header.writers.HstsHeaderWriter  : Not injecting HSTS header since it did not match the requestMatcher org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@4ea0d6af
2020-05-29 13:52:40.382 DEBUG 21056 --- [nio-8080-exec-1] w.c.HttpSessionSecurityContextRepository : SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession.

Я пробовал различные другие предлагаемые решения и конфигурации CORS для более старых версий Spring Security, но ни одного из них до сих пор оказало какое-либо влияние на мою проблему.

Это похоже на последнее решение для аналогичного вопроса, также не сработало для меня:

Spring Boot Security В запрошенном ресурсе отсутствует заголовок Access-Control-Allow-Origin. Ошибка

EDIT : Я пытался использовать расширение отключения CORS для Firefox (и различных HTTP клиентов), но я не смог увидеть никаких различий, кроме перенаправления на конечную точку / login, которую я также пытался отключить, используя:

  http.httpBasic().disable()

Мое приложение Spring по-прежнему выдает ту же ошибку, что и упомянутая выше во всех тестовых случаях.

РЕДАКТИРОВАТЬ # 2: Я также пробовал:

    @Bean
public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurer() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**").allowedOrigins("http://localhost:3000");
        }
    };
}

Ответы [ 2 ]

0 голосов
/ 08 июня 2020

Очевидно, Приложение все время использовало конфигурацию по умолчанию, из-за чего ни одна из моих конфигураций безопасности не имела никакого эффекта и, следовательно, проблемы CSRF / Cors. мой класс приложения.

Со сканированием компонентов:

2020-06-08 11:28:20.764 DEBUG 5612 --- [           main] s.s.c.a.w.c.WebSecurityConfigurerAdapter : Using default configure(HttpSecurity). If subclassed this will potentially override subclass configure(HttpSecurity).
2020-06-08 11:28:20.787 DEBUG 5612 --- [           main] edFilterInvocationSecurityMetadataSource : Adding web access control expression 'authenticated', for any request
2020-06-08 11:28:20.790 DEBUG 5612 --- [           main] o.s.s.w.a.i.FilterSecurityInterceptor    : Validated configuration attributes
2020-06-08 11:28:20.791 DEBUG 5612 --- [           main] o.s.s.w.a.i.FilterSecurityInterceptor    : Validated configuration attributes

Без:

2020-06-08 11:34:56.343 DEBUG 8504 --- [           main] edFilterInvocationSecurityMetadataSource : Adding web access control expression 'permitAll', for Ant [pattern='/user/signup*']
2020-06-08 11:34:56.344 DEBUG 8504 --- [           main] edFilterInvocationSecurityMetadataSource : Adding web access control expression 'permitAll', for Ant [pattern='/auth*']
2020-06-08 11:34:56.344 DEBUG 8504 --- [           main] edFilterInvocationSecurityMetadataSource : Adding web access control expression 'permitAll', for Ant [pattern='/nummern/**']
2020-06-08 11:34:56.344 DEBUG 8504 --- [           main] edFilterInvocationSecurityMetadataSource : Adding web access control expression 'hasRole('ROLE_OWNER')', for Ant [pattern='/information/']
2020-06-08 11:34:56.345 DEBUG 8504 --- [           main] edFilterInvocationSecurityMetadataSource : Adding web access control expression 'authenticated', for any request
0 голосов
/ 02 июня 2020

Я думаю, это не сработает, потому что вы не добавили свое происхождение (localhost: 3000) в разрешенные источники. Таким образом, Spring не знает, к каким источникам есть доступ.

Руководство Spring показывает, как это сделать:

@Bean
public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurer() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/greeting-javaconfig").allowedOrigins("http://localhost:9000");
        }
    };
}

Также вы можете использовать второй вариант здесь

...