测试Spring Boot身份验证令牌& CSRF安全

时间:2017-06-12 19:18:57

标签: spring-boot spring-security spring-boot-test

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

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

这意味着我可以使用curl来获取身份验证令牌和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 tocken:

 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);

但不是auth令牌,我只是得到null。我可以将csrf令牌插入后续调用:

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

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

0 个答案:

没有答案