【问题标题】:React + springboot csrf反应 + springboot csrf
【发布时间】:2019-06-18 02:37:23
【问题描述】:

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

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

谢谢

【问题讨论】:

标签: reactjs spring-boot thymeleaf csrf


【解决方案1】:

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

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

对于反应,您可以按照该答案的方式进行操作,但不要忘记使用 <CookiesProvider> 来总结您返回的内容

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

开头

而且 csrf 不应该应用于 GET 方法。

【讨论】:

  • 感谢您填写一些额外的信息!这对我很有帮助。
  • 我能知道什么版本的 Spring Security 与您的源代码兼容吗?
  • @wonsuc 我不确定,但我正在使用 org.springframework.security 5.1.5
【解决方案2】:

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

SecurityConfig 类。

启用 csrftokenrepsitory

         .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

【讨论】:

  • 实际将csrf 令牌保存到cookie 的部分是什么? Spring Security 是否管理此过程?还是我应该从前端层手动保存令牌?
  • @wonsuc 是的。它是通过弹簧安全处理的。无需在前端保存。
  • 完美。谢谢!
猜你喜欢
  • 2020-02-20
  • 2018-04-30
  • 2020-10-27
  • 2018-11-17
  • 2012-01-05
  • 1970-01-01
  • 2020-04-11
  • 2022-11-19
  • 2022-12-15
相关资源
最近更新 更多