SpringBoot2 + Spring security Метод CORS OPTIONS возвращает код 401 - PullRequest
0 голосов
/ 06 января 2019

Я использую Angular + Spring Boot2 + Spring Security. Я создал WebMvcConfigurer конфиг для разрешения CORS:

@Component
@Profile("dev")
class DevWebMvcConfigurer implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**").allowedMethods(ALL);
        registry.addMapping("/oauth/token").allowedMethods(ALL);
    }
}

И создать конфигурацию безопасности:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and().authorizeRequests()
                .antMatchers("/login", "/security/**").permitAll()
                .anyRequest().authenticated()
                .and().formLogin().permitAll()
                .and().csrf().disable();
    }
}

Но, когда я пытаюсь сделать запрос из углового:

Request URL: http://localhost:8080/oauth/token
Request Method: OPTIONS
Status Code: 401 

Я получаю 401 код ошибки. Как я могу это исправить? Все примеры, которые я нашел, сводятся к написанию фильтра вроде этого:

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter {

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        final HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type");
        response.setHeader("Access-Control-Max-Age", "3600");
        if (HttpMethod.OPTIONS.name().equalsIgnoreCase(((HttpServletRequest) req).getMethod())) {
            response.setStatus(HttpServletResponse.SC_OK);
        } else {
            chain.doFilter(req, res);
        }
    }

    @Override
    public void destroy() {
    }

    @Override
    public void init(FilterConfig config) throws ServletException {
    }
}

Но это какое-то дерьмо. Мы устанавливаем статус для всех OPTIONS запросов, что все в порядке. Что это?

Мой DevWebMvcConfigurer создается только при профиле dev. Как мне добавить OPTIONS запросов на разрешение?

1 Ответ

0 голосов
/ 07 января 2019

Вы должны добавить /oauth/token в конфигурацию.

        http.cors().and().authorizeRequests()
                // add the "/oauth/token" permitAll
                .antMatchers("/login", "/security/**","/oauth/token").permitAll()
                .anyRequest().authenticated()
                .and().formLogin().permitAll()
                .and().csrf().disable();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...