Java 当MockMvc不可自动编译时,从Spring Security有选择地应用单个筛选器
My WebSecurityConfigureAdapter是用Java 当MockMvc不可自动编译时,从Spring Security有选择地应用单个筛选器,java,spring,spring-boot,spring-security,spring-test,Java,Spring,Spring Boot,Spring Security,Spring Test,My WebSecurityConfigureAdapter是用http.csrf().csrfTokenRepository(csrfTokenRepository())定义的 我想做一个只激活CSRF滤波的集成测试,但我遇到了一个问题: CSRFTokenRepository未在上下文中公开 CSRFilter在Spring的上下文中似乎没有作为bean公开 我想以以下方式进行测试: this.mockMvc = webAppContextSetup(super.webApplic
http.csrf().csrfTokenRepository(csrfTokenRepository())定义的代码>
我想做一个只激活CSRF滤波的集成测试,但我遇到了一个问题:
- CSRFTokenRepository未在上下文中公开
- CSRFilter在Spring的上下文中似乎没有作为bean公开
我想以以下方式进行测试:
this.mockMvc = webAppContextSetup(super.webApplicationContext)
.apply(springSecurity(CSRFFilter.class)) //This is just a showcase of that I pretend
.alwaysDo(print())
.build();
如何在集成测试中选择性地应用单一筛选器(如CSRFFilter)而不是通用的SecurityLockMVCConfigurers.springSecurity()?请注意,此答案附带了一个完整的工作示例
这类问题很有趣。因为它是这样的
发现了一个问题,该问题未在堆栈溢出问题中披露
对这个问题有一个建议的解决办法
提出的解决方案成了问题,但我们不知道这是最好的解决方案
因此,我不确定您是否应该在测试中修改应用程序上的过滤器链。最终的结果是,您不是在测试您的应用程序,而是在测试您修改后的应用程序,这些应用程序将永远不会投入生产
为了避免产生疑问,鉴于提出的问题是最佳解决方案,这是可能的。我是这样做的
我创建了一个在执行任何其他过滤器之前返回500错误的过滤器
static class FiveHundredFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
response.setStatus(500);
response.getWriter().write("TEST FILTER CHAIN");
}
}
然后,我创建了一个将此过滤器添加到所有过滤器链的。您可以在此处选择要将其添加到的链
static class SecurityFilterChainPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if ("springSecurityFilterChain".equals(beanName)) {
FilterChainProxy fcp = (FilterChainProxy) bean;
for (SecurityFilterChain fc : fcp.getFilterChains()) {
fc.getFilters().add(0, new FiveHundredFilter());
}
}
return bean;
}
}
最后,我在我的应用程序上下文中将
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(basePackages = "org/springframework/security/community/samples")
public static class SpringBootApplicationTestConfig {
@Bean
SecurityFilterChainPostProcessor securityFilterChainPostProcessor() {
return new SecurityFilterChainPostProcessor();
}
}
我相信这会解决您的困境。请注意,此答案附有一份完整且有效的样本
这类问题很有趣。因为它是这样的
发现了一个问题,该问题未在堆栈溢出问题中披露
对这个问题有一个建议的解决办法
提出的解决方案成了问题,但我们不知道这是最好的解决方案
因此,我不确定您是否应该在测试中修改应用程序上的过滤器链。最终的结果是,您不是在测试您的应用程序,而是在测试您修改后的应用程序,这些应用程序将永远不会投入生产
为了避免产生疑问,鉴于提出的问题是最佳解决方案,这是可能的。我是这样做的
我创建了一个在执行任何其他过滤器之前返回500错误的过滤器
static class FiveHundredFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain) throws ServletException, IOException {
response.setStatus(500);
response.getWriter().write("TEST FILTER CHAIN");
}
}
然后,我创建了一个将此过滤器添加到所有过滤器链的。您可以在此处选择要将其添加到的链
static class SecurityFilterChainPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if ("springSecurityFilterChain".equals(beanName)) {
FilterChainProxy fcp = (FilterChainProxy) bean;
for (SecurityFilterChain fc : fcp.getFilterChains()) {
fc.getFilters().add(0, new FiveHundredFilter());
}
}
return bean;
}
}
最后,我在我的应用程序上下文中将
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(basePackages = "org/springframework/security/community/samples")
public static class SpringBootApplicationTestConfig {
@Bean
SecurityFilterChainPostProcessor securityFilterChainPostProcessor() {
return new SecurityFilterChainPostProcessor();
}
}
我相信这会解决你的困境