Spring Security CORS вызов пружины удаляет заголовки из запроса - PullRequest
0 голосов
/ 15 января 2019

У меня есть приложение безопасности с пружинной загрузкой + пружиной, в котором я разрешил CORS (междоменный) вызов приложения.

У меня определена следующая конфигурация безопасности пружины,

http
            .authorizeRequests()
                .antMatchers( "/transaction/**").hasRole(SOME_ROLES)
                .antMatchers( "/", "/anonymous/pay").permitAll()
                .anyRequest().authenticated()
            .and()
                .csrf().disable()
            .addFilterBefore(new StatelessLoginFilter(LOGIN_FILTER_URL, tokenAuthenticationService, authenticationManager()), UsernamePasswordAuthenticationFilter.class)
            .addFilterBefore(new StatelessAuthenticationFilter(tokenAuthenticationService), UsernamePasswordAuthenticationFilter.class)
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).maximumSessions(1);

И я добавил ниже конфигурацию CORS,

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {

        registry.addMapping("/anonymous/pay")
            .allowedOrigins("http://mydomain:8080")
            .allowedMethods("PUT", "DELETE", "OPTIONS")
            .allowedHeaders("header1", "header2", "header3")
            .exposedHeaders("header1", "header2")
            .allowCredentials(true).maxAge(3600);

        // Add more mappings...
    }
}

Вопрос:

Когда запрос отправляется на http://mydomain:8080/anonymous/pay из другого источника (перекрестное происхождение), фильтры по-прежнему активируются, и это также без заголовков, которые были отправлены в фактический вызов /pay. Замечено, что вызов OPTIONS отправляется на сервер из chrome перед отправкой фактического запроса. Но в /pay отсутствуют заголовки, которые были отправлены в реальном запросе. Как только StatelessAuthenticationFilter запущен, запрос HTTP не содержит headers, которые были отправлены в вызове /pay.

Есть идеи?

1 Ответ

0 голосов
/ 04 августа 2019

Недавно столкнулся с этой проблемой и нашел решение для нее.

Что происходит, когда вы отправляете запрос из разных источников, в моем случае с браузером, запрос 'preflight' отправляется на тот же URL-адрес, но с методом OPTIONAL http и некоторыми заголовками ( исключая те, которые вы добавили, следовательно, они отсутствуют).

Ваша конфигурация Spring Security запрещает авторизацию для этого предварительного запроса, потому что он был настроен таким образом (непреднамеренно естественно), и вы получите ответ 403.

Это обсуждалось здесь как проблема, благодаря которой я нашел это решение chuan-su .

[РЕДАКТИРОВАТЬ] Найден ТАК вопрос Роберта Шмидта , который начал обсуждение, связанное выше.

В основном вам нужно соединить cors().and() до http в вашей конфигурации безопасности Spring и изменить конфигурацию CORS следующим образом

@Override
public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/**")
        .allowedOrigins("*") //possibly redundant
        .allowedMethods("HEAD", "GET", "PUT", "POST", "DELETE", "PATCH")
             // which ever methods you will be using
        .allowedHeaders("Authorization", "Cache-Control", "Content-Type")
            // headers that you will be adding to your requests
        .allowCredentials(true);
}

Если вы конфигурируете CORS путем внедрения CorsConfigurationSource @Bean, chuan-su упомянул его настройку в своем решении вместе с методом, приведенным выше. Смотрите ссылку.

[РЕДАКТИРОВАТЬ] Ссылка на другой ответ, который чище подход в соответствии с самим постом. Хотя не пробовал, но похоже, что это сработает.

...