此测试无法正常工作:POST请求未经过身份验证
@Test
public void testSecuredPostEntity() throws Exception {
mockMvc.perform(formLogin().user("test").password("test"))
.andExpect(authenticated().withUsername("test").withRoles("ADMIN"));
mockMvc.perform(post("/authors")
.content("{\"name\":\"toto\",\"birth\":\"2016-01-01\"}")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(authenticated()) // FAILURE no authentication
.andExpect(status().isOk()) // 403 here if above commented
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andExpect(jsonPath("$.id", notNullValue()))
.andExpect(jsonPath("$.createdBy", is("test")))
.andExpect(jsonPath("$.createdDate", notNullValue()));
mockMvc.perform(logout())
.andExpect(status().isOk());
}
有人知道在执行此类请求时如何进行身份验证?
答案 0 :(得分:1)
好的,明白了:
MvcResult mvcResult = mockMvc.perform(formLogin().user("test").password("test"))
.andExpect(authenticated().withUsername("test")
.withRoles("ADMIN"))
.andReturn();
MockHttpSession session = (MockHttpSession) mvcResult.getRequest().getSession(false);
mockMvc.perform(post("/authors")
.session(session)
.content("{\"name\":\"toto\",\"birth\":\"2016-01-01\"}")
.contentType(MediaType.APPLICATION_JSON));
答案 1 :(得分:1)
根据您的评论回复,您似乎没有对MockMvcBuilders
应用任何特殊内容,因此我假设您使用standaloneSetup或webAppContextSetup而无需其他选项。
为了进行安全感知集成测试,首先应该在webAppContextSetup上启用springSecurity()(AFAIK只适用于此设置),如下所示:
mockMvc = MockMvcBuilders.webAppContextSetup(context)
.apply(springSecurity())
.build();
这再次打开安全性(对于正常的集成测试,安全性已关闭)。
现在,您可以使用@WithMockUser
注释启用自定义用户身份验证:
@Test
@WithMockUser(username = "test", roles = {"ADMIN"})
public void testSecuredPostEntity() throws Exception {
mockMvc.perform(post("/authors")
.content("{\"name\":\"toto\",\"birth\":\"2016-01-01\"}")
.contentType(MediaType.APPLICATION_JSON))
.andExpect(authenticated()) // FAILURE no authentication
.andExpect(status().isOk()) // 403 here if above commented
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andExpect(jsonPath("$.id", notNullValue()))
.andExpect(jsonPath("$.createdBy", is("test")))
.andExpect(jsonPath("$.createdDate", notNullValue()));
}
注意:您需要org.springframework.security:spring-security-test依赖这些功能