如何从 GET /csrf 端点获取 CSRF 令牌?

时间:2021-01-12 04:18:43

标签: java spring spring-boot csrf

我的目标是将 CSRF 添加到 STOMP 标头中。

我尝试过的方法确实有效,但我不确定是否应该使用它,因为我没有在 Spring Security Reference 中找到此解决方案:

  1. 使用 cookie(向任何未受保护的 GET 端点发送请求以获取 CSRF 令牌)

WebSecurityConfig.java

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http
            .csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
  }
}

我尝试过的:

  1. 按照 the official reference 创建 GET /csrf 端点:

CsrfController.java

@RestController
public class CsrfController {

  @RequestMapping("/csrf")
  public CsrfToken csrf(CsrfToken token) {
    return token;
  }
}

WebSecurityConfig.java

@EnableWebSecurity // for endpoint GET /csrf to work.
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests().antMatchers("/csrf").permitAll();
  }
}
  1. 在 SO 上关注了 this marked answer

CsrfController.java

@RestController
public class CsrfController {

  @RequestMapping("/csrf")
  public String csrf(HttpServletRequest request) {
    CsrfToken token = (CsrfToken)request.getAttribute(CsrfToken.class.getName());
    return token.getToken();
  }
}

我的预期结果是:GET /csrf 端点返回令牌值。

我的实际结果是:响应是“内部服务器错误”,还有一个错误日志。

java.lang.IllegalStateException: No primary or single public constructor found for interface org.springframework.security.web.server.csrf.CsrfToken - and no default constructor found either

0 个答案:

没有答案