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;
...
}