Замените диспетчер аутентификации по умолчанию в Spring Security/BootJAVA

Программисты JAVA общаются здесь
Anonymous
Замените диспетчер аутентификации по умолчанию в Spring Security/Boot

Сообщение Anonymous »

Диспетчер аутентификации по умолчанию в Spring Security - это поставщик manager , который делегирует в DaoAuthenticationProvider .
в моем приложении Spring Boot я хочу добавить второй поставщик аутентификации, так что пользователи аутентифицируют любого Чтобы достичь этого, я строю менеджер аутентификации с помощью аутентификации managerbuilder Согласно этой статье

Код: Выделить всё

@Configuration
@EnableWebSecurity
@EnableMethodSecurity
public class SecurityConfiguration {

@Bean
public AuthenticationManager authenticationManager(UserDetailsService userDetailsService,
PasswordEncoder passwordEncoder,
HttpSecurity http) throws Exception {

var singleFactorProvider = new DaoAuthenticationProvider(passwordEncoder);
singleFactorProvider.setUserDetailsService(userDetailsService);
var twoFactorProvider = new TwoFactorAuthenticationProvider(passwordEncoder, userDetailsService);

return http.getSharedObject(AuthenticationManagerBuilder.class)
.authenticationProvider(singleFactorProvider)
.authenticationProvider(twoFactorProvider)
.build();
}

@Bean
public SecurityFilterChain configure(AuthenticationManager authenticationManager,
HttpSecurity http) throws Exception {
// The real class has additional configuration, but I've omitted it as it's
// not relevant to the question
return http.authenticationManager(authenticationManager).build()
}
}
< /code>
Когда я пытаюсь получить ссылку на этот диспетчер аутентификации, я получаю реализацию по умолчанию. Я не могу в зависимости от инъекции аутентификации manager 
напрямую, потому что она вызывает определение круговых бобов, поэтому вместо этого я попробовал
  • инъекция аутентификацииконфигурации и вызов аутентификации Managemanager
  • getObject ()
Единственный способ, который работает,-это поиск бобов во время выполнения, т.е.

Код: Выделить всё

class MyClass implements BeanFactoryAware {

private BeanFactory beanFactory;

public Authentication authenticate(Authentication authRequest) {
// this returns my custom AuthenticationManager
var authenticationManager = beanFactory.getBean(AuthenticationManager.class);
return authenticationManager.authenticate(authRequest);
}

@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
}
Итак, если я откладываю получение менеджера по аутентификации до выполнения выполнения, я получаю тот, который определяется в SecurityConfiguration , но если я получаю его ранее (когда вводятся зависимости), я получаю дефолт. просмотр боба во время выполнения)?

Подробнее здесь: https://stackoverflow.com/questions/795 ... urity-boot

Вернуться в «JAVA»