2

У меня есть пользовательский initialzer, который расширяет AbstractSecurityWebApplicationInitializer. Он добавляет пару фильтров в начало цепочки фильтров.Spring 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 load it) в среде тестирования интеграции. Вот фрагмент теста:

@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. Вы можете ввести цепочку фильтров, а затем добавить ее с помощью шаблона построителя.

В этом блоге подробно описывается, как настроить этот параметр и различные параметры тестирования с помощью Spring Security. 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

Я читал эту статью и уже попробовал ваш код :). Injected 'springSecurityFilterChain' действительно имеет все необходимые фильтры безопасности, кроме тех, что из' SecurityApplicationInitializer'. Я проверил: 'SecurityApplicationInitializer.beforeSpringSecurityFilterChain()' не получает вызов. –

 Смежные вопросы

  • Нет связанных вопросов^_^