2

開始我有自定義initialzer延伸AbstractSecurityWebApplicationInitializer。它在過濾器鏈的開始處添加了一些過濾器。春天AbstractSecurityWebApplicationInitializer不集成測試

@Order(2) 
public class SecurityApplicationInitializer extends AbstractSecurityWebApplicationInitializer { 
    @Override 
    protected void beforeSpringSecurityFilterChain(ServletContext servletContext) { 
     CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); 
     characterEncodingFilter.setEncoding(StandardCharsets.UTF_8.name()); 
     characterEncodingFilter.setForceEncoding(true); 
     HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter(); 
     insertFilters(servletContext, characterEncodingFilter, hiddenHttpMethodFilter); 
    } 
} 

在生產中,它按預期工作。但是我不能在集成測試環境中開始(或者更好地說:讓Spring加載它)。 下面是測試的片段:

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration(classes = {ApplicationConfiguration.class, FakeInMemoryMongoConfiguration.class, WebConfiguration.class}) 
@ActiveProfiles("test") 
public class CarPartControllerIntegrationTest { 
    @Autowired 
    private WebApplicationContext wac; 
    private MockMvc mockMvc; 

    @Before 
    public void setUp() throws Exception { 
     mockMvc = webAppContextSetup(wac).build(); 
    } 
    ... 
} 

即,SecurityApplicationInitializer.beforeSpringSecurityFilterChain()沒有在測試過程中調用。現在我決定在測試的過濾鏈中手動添加過濾器。但我認爲應該有更好的解決方案。

請幫助讓世界變得更好:)謝謝!

回答

3

您需要配置Spring Security爲您的測試,如果你正在使用MockMvc。您可以注入過濾器鏈,然後使用構建器模式添加它。

本博客文章詳細介紹如何設置這與春季安全不同的測試選項。 http://spring.io/blog/2014/05/23/preview-spring-security-test-web-security

爲了您的具體的例子,你可以這樣做:

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration(classes = {ApplicationConfiguration.class, FakeInMemoryMongoConfiguration.class, WebConfiguration.class}) 
@ActiveProfiles("test") 
public class CarPartControllerIntegrationTest { 
    @Autowired 
    private WebApplicationContext wac; 

    @Autowired 
    private Filter springSecurityFilterChain; 

    private MockMvc mockMvc; 

    @Before 
    public void setUp() throws Exception { 
      mockMvc = MockMvcBuilders 
        .webAppContextSetup(wac) 
        .addFilters(springSecurityFilterChain) 
        .build(); 
    } 
} 
+0

我讀過那篇文章,並已經嘗試過你的代碼:)。注入的'springSecurityFilterChain'確實有所有需要的安全過濾器,除了那些來自'SecurityApplicationInitializer'的安全過濾器。我檢查了'SecurityApplicationInitializer.beforeSpringSecurityFilterChain()'沒有被調用。 –