java - MockMvc 和 Spring Security - Null FilterChainProxy

标签 java spring-mvc testing spring-security

我需要测试我的 REST Controller ,它们使用 Spring Security 进行保护。我正在使用 MockMvc 作为 spring security reference suggests here

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.springframework.security.web.FilterChainProxy.getFilters(FilterChainProxy.java:223)

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

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

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

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)

我不知道为什么 FilterChainProxy 为空。在我的 Web.xml 中,我声明了带有过滤器名称 springSecurityFilterChain 的 DelegatingFilterProxy,我的应用程序工作正常。请帮我!谢谢

最佳答案

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

对于独立设置,需要将她的安全配置添加到@ContextConfiguration 并 Autowiring 此 bean:

 @Autowired
 FilterChainProxy springSecurityFilterChain;

然后像这样准备MockMvc:

MockMvc mockMvc = MockMvcBuilders
   .standaloneSetup(controller)
   .apply(SecurityMockMvcConfigurers.springSecurity(springSecurityFilterChain))
   .build();

关于java - MockMvc 和 Spring Security - Null FilterChainProxy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34156129/

相关文章:

java - Spring/MVC webapp 中 Controller 和 Model Java 类的命名约定?

spring - 移动设备注册 Spring Social

javascript - 测试一个函数,该函数对所有可能的情况采用 3 个整数

java - 似乎无法运行 jar 文件

Java接口(interface)的实现?

java - 从在 docker 容器内运行的应用程序连接到在本地运行的数据库

python - 如何在 plone.app.testing 中添加 Members 文件夹?

javascript - 在 java 中编码 api 响应并在 angular js 中解码

java - 在 spring 中使用 ajax 调用从 Controller 获取 map

testing - 如何在开发和测试之间切换我的 sinatra 服务器?