1

我已经将我的 SpringBoot 应用程序配置为使用身份验证令牌和 CSRF 令牌进行身份验证:

http
  .authorizeRequests()
  .antMatchers("/**")
  .hasRole(/**/)
  .and()
  .csrf()
  .requireCsrfProtectionMatcher(new NoAntPathRequestMatcher(new String[]{"/login"}))
  .and()
  .httpBasic()
  .and()
  .addFilterAfter(new CsrfGrantingFilter(), SessionManagementFilter.class);

这意味着我可以使用 curl 来获取 auth 令牌和 csrf 令牌:

curl -s -v -X POST "http://localhost:8088/login" -u<username>:<password> | jq .

...
< X-Frame-Options: DENY
< csrf-token: <token>
< X-Application-Context: application:dev:8088
< x-auth-token: <token>
< Content-Type: application/json;charset=UTF-8
...

然后使用它们调用服务上的其他方法:

curl -s -v -X GET "http://localhost:8088/users" -H "x-auth-token: <token>" -H "X-CSRF-TOKEN: <token>" | jq .

这完全符合预期,但我想在 SpringBoot 中编写一个自动化测试来做同样的事情。我可以得到 csrf 令牌:

 MvcResult mvcResult =
                mockMvc.perform(MockMvcRequestBuilders.post("/login")).andExpect(MockMvcResultMatchers.status().is2xxSuccessful()).andReturn();

MockHttpServletResponse response = mvcResult.getResponse();
final String csrf = response.getHeader("csrf-token");
final String authToken = response.getHeader("x-auth-token");
System.out.println(csrf);
System.out.println(authToken);

但不是身份验证令牌,我只是得到空值。我可以将 csrf 令牌插入后续调用:

mockMvc.perform(MockMvcRequestBuilders.get("/users").header("X-CSRF-TOKEN", csrf)).andExpect(MockMvcResultMatchers.status().is2xxSuccessful()).andReturn();

但是,它当然无法进行身份验证。关于如何完成这项工作的任何建议?

4

0 回答 0