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 如何在集成测试中使用spring安全性?_Java_Spring_Spring Boot_Spring Security_Spring Test Mvc - Fatal编程技术网

Java 如何在集成测试中使用spring安全性?

Java 如何在集成测试中使用spring安全性?,java,spring,spring-boot,spring-security,spring-test-mvc,Java,Spring,Spring Boot,Spring Security,Spring Test Mvc,我有以下websecurityConfigureAdapter实现: @Configuration @Order(0) @EnableWebSecurity public class SecurityConfiguration extends WebSecurityConfigurerAdapter { private static final List<String> permittedPaths = asList(); private static final S

我有以下
websecurityConfigureAdapter
实现:

@Configuration
@Order(0)
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
    private static final List<String> permittedPaths = asList();
    private static final String protectedPath = "";

    private final UserDetailsServiceImpl userDetailsService;
    private final JwtAuthenticationProvider jwtAuthenticationProvider;
    private final DataSource dataSource;

    public SecurityConfiguration(
        UserDetailsServiceImpl userDetailsService,
        JwtAuthenticationProvider jwtAuthenticationProvider,
        DataSource dataSource
    ) {
        this.userDetailsService = userDetailsService;
        this.jwtAuthenticationProvider = jwtAuthenticationProvider;
        this.dataSource = dataSource;
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {}

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService);
        auth.authenticationProvider(jwtAuthenticationProvider);
        auth.jdbcAuthentication().dataSource(dataSource)
                .usersByUsernameQuery("")
                .authoritiesByUsernameQuery("")
                .passwordEncoder(passwordEncoder());
    }
}
运行后,我得到以下错误:

原因: org.springframework.beans.factory.unsatifiedDependencyException: 创建文件中定义了名为“securityConfiguration”的bean时出错 [SecurityConfiguration.class]:表示未满足的依赖项 通过构造函数参数0;嵌套异常是 org.springframework.beans.factory.noSuchBean定义异常:否 “UserDetailsServiceImpl”类型的合格bean可用:应为 至少1个符合autowire候选资格的bean。附属国 注释:{}

当我添加到此测试
SecurityConfiguration
类bean时:

@MockBean
private JwtAuthenticationProvider jwtAuthenticationProvider;
@MockBean
private UserDetailsServiceImpl userDetailsService;
@MockBean
private DataSource dataSource;
测试正常运行,没有任何
NoSuchBeanDefinitionException
异常

这个解决方案对我来说是不够的。有没有其他方法可以避免将安全bean放入每个集成测试

我尝试使用:

  • @Import({ErrorHandlerConfiguration.class,SecurityConfiguration.class})
  • @ContextConfiguration(classes={SecurityConfiguration.class})
没有任何结果

(为了简洁起见,删除了方法体和一些字符串)

//编辑 附加缺少的类,这些类被注入到
安全配置中

@Service
public class UserDetailsServiceImpl implements UserDetailsService {
//method implementation
}

@Component
public class JwtAuthenticationProvider implements AuthenticationProvider {
//method implementation
}

这是一个有限制的猜测,但由于某些原因,您没有发布缺少的类
UserDetailsServiceImpl

如果您阅读了有关
WebMvcTest
的文档,则说明:

@WebMvcTest
自动配置Spring MVC基础结构,并将扫描的bean限制为
@Controller
@ControllerAdvice
@JsonComponent
转换器
通用转换器
过滤器
HandlerInterceptor
WebMVCConfiguer
,和
HandlerMethodArgumentResolver

使用
@WebMvcTest
注释时,不扫描常规
@组件
@ConfigurationProperties
bean
@EnableConfigurationProperties
可用于包含
@ConfigurationProperties
bean

所以我猜你的豆子是因为这个原因没有被摘下来的,这都是在报纸上说的


但正如前面所说,这是一个猜测,因为出于某种原因,您没有发布我们需要查看的缺少的代码,而且对于空构造函数和其他空函数,还有一些未知因素。

也许这会有所帮助:感谢链接。但主要区别在于,
@SpringBootTest
运行整个ApplicationContext(即,使用持久化层),这对于我测试控制器响应的集成测试来说是不需要的。也许没有其他选择,我必须运行整个上下文。无论如何,这是提示。为什么
SecurityConfiguration
中的构造函数是空的?@Toerktumlare构造函数为简洁起见是空的。参数被指定给类字段。我修复了它。我添加了一些类,这些类被注入到
SecurityConfiguration
中。您使用
excludeFilters
@AutoConfigureMockMvc(addFilters=false)
的第一个示例有效!谢谢你的小费。
@WebMvcTest(
    value = SomeController.class,
    excludeAutoConfiguration = SecurityAutoConfiguration.class,
    excludeFilters = @ComponentScan.Filter(
            type = FilterType.ASSIGNABLE_TYPE,
            classes = WebSecurityConfigurer.class))
@AutoConfigureMockMvc(addFilters = false)
public class SomeControllerTest {

    @Autowired
    MockMvc mockMvc;
    
    ...
}
@WebMvcTest(
    value = SomeController.class,
    excludeAutoConfiguration = SecurityAutoConfiguration.class,
    excludeFilters = @ComponentScan.Filter(
            type = FilterType.ASSIGNABLE_TYPE,
            classes = WebSecurityConfigurer.class))
@AutoConfigureMockMvc(addFilters = false)
public class SomeControllerTest {

    @Autowired
    MockMvc mockMvc;
    
    ...
}