我已经将我的 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();
但是,它当然无法进行身份验证。关于如何完成这项工作的任何建议?