我有一个追随者 WebSecurityConfigurerAdapter
实施:
@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());
}
}
对于正常运行的应用程序,这种安全机制可以很好地工作。但在测试中-失败。我有一个集成测试,比如:
@WebMvcTest(SomeController.class)
@Import({ErrorHandlerConfiguration.class})
class SomeControllerItTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private RegistrationService registrationService;
@Test
void shouldConfirmRegistration() {}
}
运行之后,我得到以下错误:
原因:org.springframework.beans.factory.unsatifieddependencyException:创建名为“securityconfiguration”的bean时出错,该bean在文件[securityconfiguration.class]中定义:通过构造函数参数0表示的未满足的依赖关系;嵌套异常为org.springframework.beans.factory.nosuchbeandefinitionexception:没有类型为“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})
没有任何结果。
(为简洁起见,删除了方法体和一些字符串)
//编辑附加的缺少的类,这些类被注入到 SecurityConfiguration
:
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
//method implementation
}
@Component
public class JwtAuthenticationProvider implements AuthenticationProvider {
//method implementation
}
2条答案
按热度按时间7uzetpgm1#
vx6bjr1n2#
这是一个限定猜测,但由于某些原因,您没有发布丢失的类
UserDetailsServiceImpl
.如果你阅读了关于
WebMvcTest
它指出:@WebMvcTest
自动配置springmvc基础设施并将扫描的bean限制为@Controller
,@ControllerAdvice
,@JsonComponent
,Converter
,GenericConverter
,Filter
,HandlerInterceptor
,WebMvcConfigurer
,和HandlerMethodArgumentResolver
.常规
@Component
以及@ConfigurationProperties
当@WebMvcTest
使用注解。@EnableConfigurationProperties
可用于包括@ConfigurationProperties
豆。所以我猜你的豆子是不是因为这个原因,它都在文件中声明。
但如前所述,这是一个猜测,因为出于某种原因,您没有发布供我们查看的缺少的代码,而且还有一些未知的内容,比如空构造函数和其他空函数。