【发布时间】:2019-07-31 07:11:33
【问题描述】:
我有一个在端口 8888 上运行的 Spring Boot 后端应用程序和一个在 4200 上运行的 Angular 前端应用程序。
在我的 Spring Boot 应用程序中,我定义了以下 bean 来处理 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
}
使用此配置一切正常,我可以从 Angular 应用程序成功调用我的 API。
但我想启用 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。
相应的请求和响应头如下所示:
XSRF-TOKEN 响应 cookie 存在。
我不知道问题出在哪里。
我尝试在我的 Angular 应用中导入 HttpClientXsrfModule,但没有任何区别。
非常感谢任何建议。
【问题讨论】:
标签: javascript java angular spring spring-boot