2015-12-08 3 views
4

Мне нужно проверить мои контроллеры REST, которые они защищены с помощью Spring Security. Я использую MockMvc в качестве ссылки весной безопасности предполагает здесьMockMvc и Spring Security - Null FilterChainProxy

http://docs.spring.io/spring-security/site/docs/4.0.x/reference/htmlsingle/#test-mockmvc

Тест:

@ContextConfiguration(locations = "classpath:applicationContext.xml") 
@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
public class LikesTest { 

    protected MockMvc mockMvc; 

    @Autowired 
    private WebApplicationContext context; 

    @Before 
    public void setup() { 
     mockMvc = MockMvcBuilders 
       .webAppContextSetup(context) 
       //.standaloneSetup(new MessageController()) 
       .apply(SecurityMockMvcConfigurers.springSecurity()) 
       .build(); 
    } 

    @Test 
    @WithMockUser("user") 
    public void testAddLike() throws Exception { 
     mockMvc.perform(get("/like?msgId=4&like=false")); 
    } 
} 

Когда я бегу тест JUnit, я получаю этот отказ след

java.lang.NullPointerException at org.springfra mework.security.web.FilterChainProxy.getFilters (FilterChainProxy.java:223)

Кроме того, если удалить компонент внутри applicationContext.xml:

<bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy"/> 

Тогда я получаю этот отказ след:

java.lang.IllegalStateException: springSecurityFilterChain не может быть null. Убедитесь, что Bean с именем springSecurityFilterChain реализующий фильтр присутствует или вводит фильтр, который будет использоваться. в org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurer.beforeMockMvcCreated (SecurityMockMvcConfigurer.java:62)

Я понятия не имею, почему FilterChainProxy равна нулю. Внутри моего Web.xml я объявляю DelegatingFilterProxy с именем фильтра springSecurityFilterChain, и мое приложение отлично работает. Пожалуйста, помогите мне! Спасибо

ответ

-8

Мне удалось заставить его работать. Просто убедитесь, что у вас есть правильные конфигурации контекста. Также вам не нужно объявлять компонент FilterChainProxy. Спасибо

+0

Я предполагаю, что это связано с https://jira.spring.io/browse/SEC-3144 –

+2

>>> Просто убедитесь, что у вас есть правильные конфигурации контекста. Если люди знают, как их конфигурации должны выглядеть, тогда они не придут на этот пост. – Mrusful

+0

Нехорошо было бы дать более подробную информацию, чем «Просто убедитесь, что у вас есть правильные конфигурации контекста», который является ответом, который может быть применен, вероятно, к всем связанным с весной вопросам, не давая читателю ни малейшего понятия о реальном решении. –

3

В вашем случае, если вы используете .webAppContextSetup, вы, вероятно, забыли продлить AbstractSecurityWebApplicationInitializer, чтобы инициализировать фильтры безопасности.

С автономной установки можно было бы нужно добавить ее конфигурации безопасности для @ContextConfiguration и autowire этот компонент:

@Autowired 
FilterChainProxy springSecurityFilterChain; 

Затем подготовить MockMvc так:

MockMvc mockMvc = MockMvcBuilders 
    .standaloneSetup(controller) 
    .apply(SecurityMockMvcConfigurers.springSecurity(springSecurityFilterChain)) 
    .build(); 
Смежные вопросы