我正在尝试为API调用定义我自己的UserDetailsService。
下面是我的安全会议:
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration {
@Bean
@Order(1)
public SecurityFilterChain apiSecurityFilterChain(HttpSecurity http, @Qualifier("apiUserDetailsService") ApiUserDetailsService apiUserDetailsService) throws Exception {
http.antMatcher("/api/**")
.userDetailsService(apiUserDetailsService)
.csrf().disable()
.cors(Customizer.withDefaults())
.exceptionHandling(configurer -> configurer.authenticationEntryPoint(new AuthenticationFallbackEntryPoint()))
.sessionManagement(configurer -> configurer.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(authorize -> authorize.anyRequest().authenticated())
.httpBasic(Customizer.withDefaults());
return http.build();
}
我希望扫描“ApiUserDetailsService”bean,并将其构造函数注入到我的apiSecurityFilterChain中。
下面是我的ApiSecurityFilterChain(这是“测试”版本):
@Component
@Primary
@Qualifier("apiUserDetailsService")
public class ApiUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String nni) {
// (...)
return new ApiUserDetails(apiUserDto, authorities);
}
}
下面是我声明AuthentTest的方式(在引入这个自定义UserDetailsService之前,它运行得很好):
@WebMvcTest({ UserController.class })
@Import({ SecurityConfiguration.class, GrantedPortalRoleConverter.class, ApiUserDetailsService.class })
@TestInstance(Lifecycle.PER_CLASS)
class AuthenticationTest {
下面是我在测试开始时得到的坏结果:
第一个
我犯了哪一个错误,导致ApiUserDetailsService bean无法示例化或无法检测为候选对象?
更新:我必须保持我的webapp启动时没有警告或错误,只有JUnit测试导致问题。
更新2:我已经将ApiUserDetailsService(我的实际实现)更改为UserDetailsService,最初的消息是完全相同的,就像如果SecurityConfiguration从未重建,那么它就工作了。我认为我有多层问题阻止它工作。
1条答案
按热度按时间mrfwxfqh1#
使用自定义Bean名称对Bean ApiUserDetailsService进行了错误的声明
或
第一个