java—如何在集成测试中使用Spring Security ?

mlnl4t2r  于 2021-07-23  发布在  Java
关注(0)|答案(2)|浏览(327)

我有一个追随者 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
}
7uzetpgm

7uzetpgm1#

@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;

    ...
}
vx6bjr1n

vx6bjr1n2#

这是一个限定猜测,但由于某些原因,您没有发布丢失的类 UserDetailsServiceImpl .
如果你阅读了关于 WebMvcTest 它指出: @WebMvcTest 自动配置springmvc基础设施并将扫描的bean限制为 @Controller , @ControllerAdvice , @JsonComponent , Converter , GenericConverter , Filter , HandlerInterceptor , WebMvcConfigurer ,和 HandlerMethodArgumentResolver .
常规 @Component 以及 @ConfigurationProperties@WebMvcTest 使用注解。 @EnableConfigurationProperties 可用于包括 @ConfigurationProperties 豆。
所以我猜你的豆子是不是因为这个原因,它都在文件中声明。
但如前所述,这是一个猜测,因为出于某种原因,您没有发布供我们查看的缺少的代码,而且还有一些未知的内容,比如空构造函数和其他空函数。

相关问题