java - 如何在 SpringSecurity Bean 中模拟自定义 UserServiceDetails 以进行单元测试?
问题描述
我有Spring Boot
启用基本身份验证的应用程序。UserServiceDetails
从数据库消耗。出于单元测试的目的,我想模拟它,因此数据将从其他地方使用。
我该怎么做?
我的问题不是如何模拟UserServiceDetails
自己,而是如何模拟我可以使用它来测试具有基本身份验证的控制器的方式。
以下是我的SpringSecurity
配置:
@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
private static final String[] AUTH_WHITELIST = {
// -- swagger ui
"/",
"/csrf",
"/swagger-resources",
"/swagger-resources/**",
"/configuration/ui",
"/configuration/security",
"/swagger-ui.html",
"/webjars/**"
};
@Autowired
@Qualifier("customUserDetailsService")
private UserDetailsService userDetailsService;
private final static Integer bCryptEncryptionLevel = 8;
@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() {
return new BCryptPasswordEncoder(bCryptEncryptionLevel);
}
public SecurityConfig() {
super();
}
@Autowired
public void configureGlobalSecurity(AuthenticationManagerBuilder authManagerBuilder) throws Exception {
authManagerBuilder.authenticationProvider(authenticationProvider());
authManagerBuilder.userDetailsService(userDetailsService)
.passwordEncoder(bCryptPasswordEncoder());
}
@Bean
public DaoAuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
authenticationProvider.setUserDetailsService(userDetailsService);
authenticationProvider.setPasswordEncoder(bCryptPasswordEncoder());
return authenticationProvider;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers(AUTH_WHITELIST).permitAll()
// allow default swagger docket
.regexMatchers("\\A/v2/api-docs\\Z").permitAll()
// require auth for any other swagger docket
.regexMatchers("\\A/v2/api-docs?.*\\Z").authenticated()
.antMatchers("/**").authenticated()
.and()
.httpBasic()
.and()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}
}
总而言之,我怎样才能模拟UserServiceDetails
到SpringSecurity
配置中,以便我可以在我的Spring Boot
应用程序中对控制器进行单元测试?
解决方案
我认为你应该使用@Profile, UserDetailesService
是一个接口创建两个实现UserDetailesService
,一个用于测试,另一个用于其余情况
@Component
@Profile("test")
public class UserDetailesServiceTestImpl implements UserDetailesService{
}
@Component
@Profile("!test")
public class UserDetailesServiceImpl implements UserDetailesService{
}
推荐阅读
- c# - 如何使用 RestClient for Unity 执行多个请求,然后在所有请求完成后执行一个函数?
- sql - 根据雪花中的字段值获取每个日期和数据透视表的最后一个值
- woocommerce - 在 WooCommerce 中编辑发送给管理员的新订单电子邮件
- reactjs - 水平对齐两个组件
- python - 如果为空,则阻止 django formset 提交
- javascript - 如何在javascript中进行通配符重定向
- android - IONIC应用程序上的后退按钮面临问题 - Angular
- python - 如何获得具有最低值的最高字典键
- python - 尝试使用熊猫交叉表时,请保持入门“AssertionError:数组和名称必须具有相同的长度”
- android - 如何为 android studio 设置原生 c++?