MockMvc和Spring Security - Null FilterChainProxy

Sen*_*pai 6 java testing spring-mvc spring-security

我需要使用Spring Security测试我们的REST控制器.我正在使用MockMvc作为弹簧安全参考建议

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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

当我正在运行JUnit测试时,我正在获得此故障跟踪

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

另外如果删除applicationContext.xml中的bean:

<bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy"/>
Run Code Online (Sandbox Code Playgroud)

然后我得到了这个失败的痕迹:

java.lang.IllegalStateException:springSecurityFilterChain不能为null.确保使用名称为springSecurityFilterChain的Bean实现Filter,或者注入要使用的Filter.在org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurer.beforeMockMvcCreated(SecurityMockMvcConfigurer.java:62)

我不知道为什么FilterChainProxy为null.在我的Web.xml中,我已经使用filter-name springSecurityFilterChain声明了DelegatingFilterProxy,我的应用程序运行正常.请帮我!谢谢

Ale*_*nov 6

在您的情况下,在使用时.webAppContextSetup您可能忘记扩展AbstractSecurityWebApplicationInitializer以初始化安全过滤器。

使用独立设置,需要将她的安全配置添加到 @ContextConfiguration 并自动装配这个 bean:

 @Autowired
 FilterChainProxy springSecurityFilterChain;
Run Code Online (Sandbox Code Playgroud)

然后像这样准备 MockMvc:

MockMvc mockMvc = MockMvcBuilders
   .standaloneSetup(controller)
   .apply(SecurityMockMvcConfigurers.springSecurity(springSecurityFilterChain))
   .build();
Run Code Online (Sandbox Code Playgroud)

  • FilterChainProxy 不是一个 bean, (2认同)

Sen*_*pai -19

我已经成功让它发挥作用了。只需确保您具有正确的上下文配置即可。另外,您不需要声明 FilterChainProxy bean。谢谢

  • &gt;&gt;&gt; 只要确保您有正确的上下文配置即可。如果人们知道他们的配置应该是什么样子,那么他们就不会来这篇文章。 (5认同)