使用springSecurityFilterChain从Spring MockMvc清空响应头

时间:2014-10-13 13:39:54

标签: spring spring-mvc spring-security spring-test

我为Spring MVC应用程序编写单元测试。

这是我的mockMvc初始化代码:

@Configuration
public class SpringMockFactory {
    @Autowired
    private WebApplicationContext wac;

    @Autowired
    private FilterChainProxy springSecurityFilterChain;

    @Bean
    @Scope("prototype")
    public MockMvc getMockMvc() {
        return webAppContextSetup(wac)
                .addFilter(springSecurityFilterChain)
                .build();
    }
}

一切正常,但是当我添加springSecurityFilterChain时,响应标头始终为空(这是重要的,因为我想检查Set-Cookie标头)。

我使用此代码执行操作:

resultActions = mockMvc.perform(post("/api/login")
                .contentType(MediaType.APPLICATION_FORM_URLENCODED)
                .param("username", "sysadmin")
                .param("password", "password")
).andDo(print());

这是andDo(print())的结果:

MockHttpServletResponse:
          Status = 200
   Error message = null
         Headers = {}
    Content type = null
            Body = {"status":200}
   Forwarded URL = null
  Redirected URL = null
         Cookies = []

问题是当我将springSecurityFilterChain与mockMvc一起使用时,为什么响应标头为空?以及如何阅读它们?

1 个答案:

答案 0 :(得分:2)

您可能需要将Spring安全配置添加到MockMvc对象。

示例:

mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();

springSecurity()初始值设定项在org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers包中提供。您可以方便地静态导入它。 请注意,您需要org.springframework.security:spring-security-test依赖(我对4.0.1.RELEASE很好)。

参见示例here(教学项目)。

我不需要手动设置Spring Security过滤器链。