Я пытаюсь начать работу с 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 внедрил его там, где он должен.
Во всяком случае, некоторые объяснения, почему это не работает, когда я использую метод переопределения, были бы полезны.