【问题标题】:Spring AbstractSecurityWebApplicationInitializer doesn't start in integration testSpring AbstractSecurityWebApplicationInitializer 没有在集成测试中启动
【发布时间】:2015-01-02 16:19:00
【问题描述】:

我有扩展 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 加载它)。 这是测试的sn-p:

@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() 在测试期间未被调用。现在我决定在测试的过滤器链中手动添加过滤器。但我认为应该有更好的解决方案。

请帮助让世界变得更美好 :) 谢谢!

【问题讨论】:

    标签: java spring spring-security integration-testing spring-test


    【解决方案1】:

    如果您使用 MockMvc,则需要为您的测试配置 Spring Security。您可以注入过滤器链,然后使用构建器模式添加它。

    这篇博文详细描述了如何设置它以及使用 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();
        }
    }
    

    【讨论】:

    • 我读过那篇文章并且已经尝试过你的代码:)。注入的springSecurityFilterChain 确实拥有所有需要的安全过滤器,但来自SecurityApplicationInitializer 的过滤器除外。我检查了,SecurityApplicationInitializer.beforeSpringSecurityFilterChain() 没有被调用。
    猜你喜欢
    • 1970-01-01
    • 2015-07-19
    • 2014-12-12
    • 2023-03-22
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    相关资源
    最近更新 更多