Не работает гибридная аутентификация

в Boot 2.6 вот такой конфиг позволял иметь гибридную аутентификацию

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {

    auth.inMemoryAuthentication()
        .withUser("remote")
        .password(passwordEncoder.encode("remote"))
        .roles("REMOTE");
    
    DaoAuthenticationProvider dao = new DaoAuthenticationProvider();
    dao.setUserDetailsService(accountDetailsService);
    dao.setPasswordEncoder(passwordEncoder);
    auth.authenticationProvider(dao);
    
}

однако в 2.7 при попытке реализовать её аналог ин-мемори юзер почему-то не определяется, и детектируются только те, кто в БД

@Bean
public AuthenticationManager authManager(HttpSecurity http) throws Exception {
    
    AuthenticationManagerBuilder auth = http.getSharedObject(AuthenticationManagerBuilder.class);
    
    DaoAuthenticationProvider dao = new DaoAuthenticationProvider();
    dao.setUserDetailsService(accountDetailsService);
    dao.setPasswordEncoder(passwordEncoder);
    
    UserDetails remote = User.builder()
            .username("remote")
            .password(passwordEncoder.encode("remote"))
            .roles("REMOTE")
            .build();
    
    auth.inMemoryAuthentication()
        .withUser(remote)
        .passwordEncoder(passwordEncoder);
    auth.authenticationProvider(dao);
         
    return auth.build();
}

Тест на аутентификацию по httpBasic у ин-мемори юзера выдаёт 401, а тест на юзера из БД но без роли REMOTE - 403.

Что не так?


Ответы (1 шт):

Автор решения: V-CHO

Переписываем вот так и радуемся жизни

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    
    DaoAuthenticationProvider dao = new DaoAuthenticationProvider();
    dao.setUserDetailsService(accountDetailsService);
    dao.setPasswordEncoder(passwordEncoder);
    
    UserDetails remote = User.builder()
            .username("remote")
            .password(passwordEncoder.encode("remote"))
            .roles("REMOTE")
            .build();
    
    inMemoryConfigurer()
        .withUser(remote)
        .passwordEncoder(passwordEncoder)
        .configure(auth);
    auth.authenticationProvider(dao);
}

private InMemoryUserDetailsManagerConfigurer<AuthenticationManagerBuilder> inMemoryConfigurer() {
    return new InMemoryUserDetailsManagerConfigurer<>();
}
→ Ссылка