react + springboot csrf

IT技术 reactjs spring-boot thymeleaf csrf
2021-05-20 09:55:57

我在 springboot 项目中有一个 react 应用程序,react 应用程序使用 rest 调用来获取/设置内容。实际上,我已经在配置适配器中禁用了 csrf,.csrf().disable()但我想对此进行管理。我如何处理 react 和 springboot 之间的 csrf 令牌?

我认为我应该通过我的 axios 调用传递令牌,但我如何得到它?

谢谢

2个回答

上面的答案我认为它使用了旧的 spring 安全版本。有一个简单的方法。对于 springboot 后端,你可以这样做

.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())

在react中,您可以按照该答案的方式进行操作,但不要忘记使用<CookiesProvider>来结束您返回的内容

或者您可以从 document.cookie 中获取令牌。应该有一对以 XSRF-TOKEN= 开头

并且 csrf 不应应用于 GET 方法。

您需要保存CSRF-TOKEN到 cookie 并将其与请求标头一起发回。

安全配置类。

启用 csrftoken 存储库

         .csrf().csrfTokenRepository(csrfTokenRepository()).and().addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class).addFilterAfter(new XSSFilter(), CsrfFilter.class);

添加 csrfTokenRepository

       private CsrfTokenRepository csrfTokenRepository() {
    HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
    repository.setHeaderName(X_CSRF_TOKEN);
    return repository;
}

作为react,您可以从 cookie 访问令牌。

    csrfToken=  cookies.get('XSRF-TOKEN');

在标题中按如下方式发送。

     headers: {
    'X-XSRF-TOKEN': this.csrfToken,
    'Accept': 'application/json',
    'Content-Type': 'application/json'
  },

https://github.com/supun/okta-spring-boot-react-crud-example/blob/master/src/main/java/com/okta/developer/jugtours/config/SecurityConfiguration.java