MockMVC formLogin authentication ...和业务操作

时间:2016-12-05 16:53:21

标签: spring spring-mvc spring-security

此测试无法正常工作: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()); }

有人知道在执行此类请求时如何进行身份验证?

2 个答案:

答案 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依赖这些功能