spring-security 找不到用户详细信息服务Bean

6g8kf2rb  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(241)

我正在尝试为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从未重建,那么它就工作了。我认为我有多层问题阻止它工作。

mrfwxfqh

mrfwxfqh1#

使用自定义Bean名称对Bean ApiUserDetailsService进行了错误的声明

@Component("apiUserDetailsService")
public class ApiUserDetailsService implements UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String nni) {
        // (...)
        return new ApiUserDetails(apiUserDto, authorities);
    }
}


第一个

相关问题