我试图为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 {下面是我在考试开始时得到的坏结果:
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'apiSecurityFilterChain' defined in class path resource [fr/mycomp/dvs/configuration/SecurityConfiguration.class]: Unsatisfied dependency expressed through method 'apiSecurityFilterChain' parameter 1;Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'fr.mycomp.dvs.security.ApiUserDetailsService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Qualifier(value="apiUserDetailsService")}我做了哪些错误阻止ApiUserDetailsService bean实例化或检测作为候选?
更新:我必须保持我的webapp在没有警告或错误的情况下启动,只有JUnit测试会导致问题。
更新2:我已经更改为ApiUserDetailsService (我的实际实现)为UserDetailsService,首先消息完全相同,就像SecurityConfiguration从未重建过一样,那么它就能工作了。我想我有多个层次的问题阻碍了它的工作。
发布于 2022-09-21 18:02:30
您通过使用自定义bean名称错误地声明了bean ApiUserDetailsService。
@Component("apiUserDetailsService")
public class ApiUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String nni) {
// (...)
return new ApiUserDetails(apiUserDto, authorities);
}
}或
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration {
@Bean
@Order(1)
public SecurityFilterChain apiSecurityFilterChain(HttpSecurity http, 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();
}
@Bean
public ApiUserDetailsService apiUserDetailsService(){
return new ApiUserDetailsService();
}
}public class ApiUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String nni) {
// (...)
return new ApiUserDetails(apiUserDto, authorities);
}
}https://stackoverflow.com/questions/73804831
复制相似问题