diff --git a/config/src/main/java/org/springframework/security/config/annotation/authentication/configuration/InitializeUserDetailsBeanManagerConfigurer.java b/config/src/main/java/org/springframework/security/config/annotation/authentication/configuration/InitializeUserDetailsBeanManagerConfigurer.java index 8e4dda56f88..7320840d9b3 100644 --- a/config/src/main/java/org/springframework/security/config/annotation/authentication/configuration/InitializeUserDetailsBeanManagerConfigurer.java +++ b/config/src/main/java/org/springframework/security/config/annotation/authentication/configuration/InitializeUserDetailsBeanManagerConfigurer.java @@ -16,8 +16,7 @@ package org.springframework.security.config.annotation.authentication.configuration; -import java.util.ArrayList; -import java.util.List; +import java.util.Arrays; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -67,9 +66,10 @@ class InitializeUserDetailsManagerConfigurer extends GlobalAuthenticationConfigu @Override public void configure(AuthenticationManagerBuilder auth) throws Exception { - List> userDetailsServices = getBeansWithName(UserDetailsService.class); + String[] beanNames = InitializeUserDetailsBeanManagerConfigurer.this.context + .getBeanNamesForType(UserDetailsService.class); if (auth.isConfigured()) { - if (!userDetailsServices.isEmpty()) { + if (beanNames.length > 0) { this.logger.warn("Global AuthenticationManager configured with an AuthenticationProvider bean. " + "UserDetailsService beans will not be used by Spring Security for automatically configuring username/password login. " + "Consider removing the AuthenticationProvider bean. " @@ -80,19 +80,18 @@ public void configure(AuthenticationManagerBuilder auth) throws Exception { return; } - if (userDetailsServices.isEmpty()) { + if (beanNames.length == 0) { return; } - else if (userDetailsServices.size() > 1) { - List beanNames = userDetailsServices.stream().map(BeanWithName::getName).toList(); + else if (beanNames.length > 1) { this.logger.warn(LogMessage.format("Found %s UserDetailsService beans, with names %s. " + "Global Authentication Manager will not use a UserDetailsService for username/password login. " - + "Consider publishing a single UserDetailsService bean.", userDetailsServices.size(), - beanNames)); + + "Consider publishing a single UserDetailsService bean.", beanNames.length, + Arrays.toString(beanNames))); return; } - UserDetailsService userDetailsService = userDetailsServices.get(0).getBean(); - String userDetailsServiceBeanName = userDetailsServices.get(0).getName(); + UserDetailsService userDetailsService = InitializeUserDetailsBeanManagerConfigurer.this.context + .getBean(beanNames[0], UserDetailsService.class); PasswordEncoder passwordEncoder = getBeanOrNull(PasswordEncoder.class); UserDetailsPasswordService passwordManager = getBeanOrNull(UserDetailsPasswordService.class); CompromisedPasswordChecker passwordChecker = getBeanOrNull(CompromisedPasswordChecker.class); @@ -113,8 +112,7 @@ else if (userDetailsServices.size() > 1) { provider.afterPropertiesSet(); auth.authenticationProvider(provider); this.logger.info(LogMessage.format( - "Global AuthenticationManager configured with UserDetailsService bean with name %s", - userDetailsServiceBeanName)); + "Global AuthenticationManager configured with UserDetailsService bean with name %s", beanNames[0])); } /** @@ -125,41 +123,6 @@ private T getBeanOrNull(Class type) { return InitializeUserDetailsBeanManagerConfigurer.this.context.getBeanProvider(type).getIfUnique(); } - /** - * @return a list of beans of the requested class, along with their names. If - * there are no registered beans of that type, the list is empty. - */ - private List> getBeansWithName(Class type) { - List> beanWithNames = new ArrayList<>(); - String[] beanNames = InitializeUserDetailsBeanManagerConfigurer.this.context.getBeanNamesForType(type); - for (String beanName : beanNames) { - T bean = InitializeUserDetailsBeanManagerConfigurer.this.context.getBean(beanName, type); - beanWithNames.add(new BeanWithName<>(bean, beanName)); - } - return beanWithNames; - } - - static class BeanWithName { - - private final T bean; - - private final String name; - - BeanWithName(T bean, String name) { - this.bean = bean; - this.name = name; - } - - T getBean() { - return this.bean; - } - - String getName() { - return this.name; - } - - } - } }