Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当MockMvc不可自动编译时,从Spring Security有选择地应用单个筛选器_Java_Spring_Spring Boot_Spring Security_Spring Test - Fatal编程技术网

Java 当MockMvc不可自动编译时,从Spring Security有选择地应用单个筛选器

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

My WebSecurityConfigureAdapter是用
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();
        }
    }
    
    我相信这会解决你的困境