Сканирование компонентов Spring не загружает свои собственные компоненты, если я изменяю basePackages? - PullRequest
0 голосов
/ 08 февраля 2020

Я пытаюсь начать работу с Spring Boot, чтобы использовать его в своих будущих проектах.

Однако после того, как я реализовал свою библиотеку «аутентификации», которая содержит некоторые простые пользовательские службы (реализация UserDetailsService ), Я попытался интегрировать это в свое новое приложение Spring Boot.

Поскольку UserService находится в отдельном JAR-файле, мне пришлось изменить базовые пакеты, в которые Spring смотрит, чтобы они загружались.

Все нормально, приложение запускается, конечные точки работают как положено. Меня перенаправляют на вход в систему, и я пытаюсь войти с моим пользователем из базы данных. Здесь проблема всплывает. Я получаю No AuthenticationProvider found for org.springframework.security.authentication.UsernamePasswordAuthenticationToken.

После копания я обнаружил, что если удалить базовые классы пакетов для сканирования и использовать память UserDetailService, все работает как положено. Я хочу использовать значение по умолчанию DaoAuthenticationProvider, которое должно просто использовать мою реализацию * 1013. *

Может ли быть, что Spring больше не загружает это, когда я изменяю basePackages, или я пропускаю что-то еще?

Вы можете увидеть, что я попробовал здесь: (не волнуйтесь, код в Scala, я просто оцениваю, как они работают вместе)

@SpringBootApplication(scanBasePackages = Array("ro.sandd", "spring.framework"))
@EnableJpaRepositories(basePackages = Array("ro.sandd"))
@EntityScan(basePackages = Array("ro.sandd"))
class SpringDemoApplication

object SpringDemoApplication extends App {
    SpringApplication.run(classOf[SpringDemoApplication]);
}

@Configuration
@EnableWebSecurity
//@Import(Array(classOf[UserService]))
//@ComponentScan(basePackageClasses = Array(classOf[UserService], classOf[DaoAuthenticationProvider]))
class WebSecurityConfig(@Autowired val userService: UserService) extends WebSecurityConfigurerAdapter with Logging {

  protected override def configure(http: HttpSecurity): Unit = {

    http.csrf().disable().authorizeRequests()
      .antMatchers("/", "/demo").permitAll()
      .anyRequest().authenticated()
      .and()
      .formLogin()
      .loginProcessingUrl("/login")
      .permitAll()
      .and()
      .logout()
      .permitAll();
  }

  @Bean
  override def userDetailsService: UserDetailsService = {
    userService
  }
}

Также у меня есть несколько простых Контроллер, но я не думаю, что стоит посмотреть код. Также ... Я, вероятно, могу предоставить нестандартного провайдера, но моя цель - использовать существующего, поскольку для меня это кажется подходящим.

PS Дальнейшее исследование 1:

Примечание 1 - Если я использую @SpringBootApplication(scanBasePackageClasses = Array(classOf[UserService])), я вижу DaoAuthenticationProvider, загруженный в AuthenticationConfiguration. Но мой метод конфигурации WebSecurityConfigurerAdapter не вызывается. Вместо этого используется org.springframework.boot.autoconfigure.security.servlet.SpringBootWebSecurityConfiguration$DefaultConfigurerAdapter.

Примечание 2. Если я использую @SpringBootApplication (scanBasePackageClasses = Array (classOf [UserService], classOf [WebSecurityConfig])), чтобы принудительно загрузить мой WebSecurityConfig, authenticationProviders список пуст.

Таким образом, может возникнуть проблема, когда этот WebSecurityConfig действительно используется. Однако ... Мне интересно, как мой UserDetailsService работал, если этот класс не использовался. Вот где я это представил, как вы можете видеть ниже. Вероятно, Spring сделал магию c и внедрил ее куда-то еще.

 @Bean
  override def userDetailsService: UserDetailsService = {
    userService
  }

PS Дальнейшее расследование 2:

Я удалил приведенную выше декларацию @Bean, и все работает как и ожидалось. Вероятно, того факта, что я уже использую AutoWire для своей UserService, достаточно, чтобы Spring внедрил его там, где он должен.

Во всяком случае, некоторые объяснения, почему это не работает, когда я использую метод переопределения, были бы полезны.

...