在 Spring Boot 和 Angular 之间处理 CORS 和 CSRF

jus*_*oob 7 javascript java spring spring-boot angular

我有一个在端口 8888 上运行的 Spring Boot 后端应用程序和一个在 4200 上运行的 Angular 前端应用程序。

在我的 Spring Boot 应用程序中,我定义了以下 bean 来处理 CORS:

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

我的HttpSecurity配置如下所示:

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

使用此配置一切正常,我可以从 Angular 应用程序成功调用我的 API。

但我想启用 CSRF,所以我将安全配置更改为以下内容:

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

我在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);
}
Run Code Online (Sandbox Code Playgroud)

问题tokenExtractor.getToken()始终是Returns null

相应的请求和响应标头如下所示:

在此处输入图片说明

XSRF-TOKEN响应存在Cookie。

我无法弄清楚问题是什么。

我试过HttpClientXsrfModule在我的 Angular 应用程序中导入,但它没有任何区别。

我真的很感激任何建议。

小智 0

不需要。您可以使用chrome nosecurity或安装Allow-Control-Allow-Origin插件即可解决问题。