Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MockMvc and Spring Security - Null FilterChainProxy

I need to test my REST Controllers which they are secured using Spring Security. I'm using MockMvc as spring security reference suggests here

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

Test:

@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"));
    }
}

When i'm running the JUnit test, i'm getting this failure trace

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

Also if remove the bean inside applicationContext.xml:

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

Then i'm getting this failure trace:

java.lang.IllegalStateException: springSecurityFilterChain cannot be null. Ensure a Bean with the name springSecurityFilterChain implementing Filter is present or inject the Filter to be used. at org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurer.beforeMockMvcCreated(SecurityMockMvcConfigurer.java:62)

I have no idea why the FilterChainProxy is null. Inside my Web.xml i have declare the DelegatingFilterProxy with filter-name springSecurityFilterChain and my application works fine. Please help me! Thanks

like image 925
Senpai Avatar asked Dec 08 '15 12:12

Senpai


1 Answers

In your case, when using .webAppContextSetup you probably forgot to extend AbstractSecurityWebApplicationInitializer to make security filters initialized.

With standalone setup one would need to add her security config to @ContextConfiguration and autowire this bean:

 @Autowired
 FilterChainProxy springSecurityFilterChain;

Then prepare MockMvc like this:

MockMvc mockMvc = MockMvcBuilders
   .standaloneSetup(controller)
   .apply(SecurityMockMvcConfigurers.springSecurity(springSecurityFilterChain))
   .build();
like image 74
A. L. Avatar answered Sep 27 '22 20:09

A. L.