Обработка CORS и CSRF между Spring Boot и Angular - PullRequest
4 голосов
/ 09 марта 2019

У меня есть внутреннее приложение Spring Boot, которое работает на порту 8888, и внешнее приложение Angular, которое работает на 4200.

В своем приложении Spring Boot я определил следующий компонент для обработки CORS:

@Bean
public WebMvcConfigurer webMvcConfigurer() {
    return new WebMvcConfigurer() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**");
        }
    };
}

И моя HttpSecurity конфигурация выглядит так:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .cors()
        .and()
        .csrf().disable()
        // ... the rest of the config
}

При такой конфигурации все работает нормально, я могу успешно вызывать мой API из приложения Angular.

Но я бы хотел включить CSRF, поэтому я изменил конфигурацию безопасности на следующую:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .cors()
        .and()
        .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
        // ... the rest of the config
}

И я добавил следующее HttpInterceptor в мое приложение Angular:

constructor(private tokenExtractor: HttpXsrfTokenExtractor) { }

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    const token = this.tokenExtractor.getToken();
    if (token) {
        req = req.clone({ setHeaders: { 'X-XSRF-TOKEN': token } });
    }
    return next.handle(req);
}

Проблема в том, что tokenExtractor.getToken() всегда возвращает null.

Соответствующие заголовки запроса и ответа выглядят так:

enter image description here

Присутствует XSRF-TOKEN ответный файл cookie.

Я не могу понять, в чем проблема.

Я пытался импортировать HttpClientXsrfModule в мое приложение Angular, но это не имеет значения.

Буду очень признателен за любой совет.

1 Ответ

0 голосов
/ 09 марта 2019

Нет необходимости. Вы можете использовать chrome nosecurity или установить плагин Allow-Control-Allow-Origin, чтобы решить проблему.

...