{"record":{"id":"89f3002e7063b9ff","repo":"spring-projects/spring-security","slug":"found-s-userdetailsservice-beans-with-names-s","errorCode":null,"errorMessage":"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.","messagePattern":"Found (.+?) UserDetailsService beans, with names (.+?)\\. Global Authentication Manager will not use a UserDetailsService for username/password login\\. Consider publishing a single UserDetailsService bean\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"config/src/main/java/org/springframework/security/config/annotation/authentication/configuration/InitializeUserDetailsBeanManagerConfigurer.java","lineNumber":88,"sourceCode":"\t\t\tString[] beanNames = InitializeUserDetailsBeanManagerConfigurer.this.context\n\t\t\t\t.getBeanNamesForType(UserDetailsService.class);\n\t\t\tif (auth.isConfigured()) {\n\t\t\t\tif (beanNames.length > 0) {\n\t\t\t\t\tthis.logger.warn(\"Global AuthenticationManager configured with an AuthenticationProvider bean. \"\n\t\t\t\t\t\t\t+ \"UserDetailsService beans will not be used by Spring Security for automatically configuring username/password login. \"\n\t\t\t\t\t\t\t+ \"Consider removing the AuthenticationProvider bean. \"\n\t\t\t\t\t\t\t+ \"Alternatively, consider using the UserDetailsService in a manually instantiated DaoAuthenticationProvider. \"\n\t\t\t\t\t\t\t+ \"If the current configuration is intentional, to turn off this warning, \"\n\t\t\t\t\t\t\t+ \"increase the logging level of 'org.springframework.security.config.annotation.authentication.configuration.InitializeUserDetailsBeanManagerConfigurer' to ERROR\");\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (beanNames.length == 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse if (beanNames.length > 1) {\n\t\t\t\tthis.logger.warn(LogMessage.format(\"Found %s UserDetailsService beans, with names %s. \"\n\t\t\t\t\t\t+ \"Global Authentication Manager will not use a UserDetailsService for username/password login. \"\n\t\t\t\t\t\t+ \"Consider publishing a single UserDetailsService bean.\", beanNames.length,\n\t\t\t\t\t\tArrays.toString(beanNames)));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tUserDetailsService userDetailsService = InitializeUserDetailsBeanManagerConfigurer.this.context\n\t\t\t\t.getBean(beanNames[0], UserDetailsService.class);\n\t\t\tPasswordEncoder passwordEncoder = getBeanOrNull(PasswordEncoder.class);\n\t\t\tUserDetailsPasswordService passwordManager = getBeanOrNull(UserDetailsPasswordService.class);\n\t\t\tCompromisedPasswordChecker passwordChecker = getBeanOrNull(CompromisedPasswordChecker.class);\n\t\t\tDaoAuthenticationProvider provider = new DaoAuthenticationProvider(userDetailsService);\n\t\t\tif (passwordEncoder != null) {\n\t\t\t\tprovider.setPasswordEncoder(passwordEncoder);\n\t\t\t}\n\t\t\tif (passwordManager != null) {\n\t\t\t\tprovider.setUserDetailsPasswordService(passwordManager);\n\t\t\t}\n\t\t\tif (passwordChecker != null) {","sourceCodeStart":70,"sourceCodeEnd":106,"githubUrl":"https://github.com/spring-projects/spring-security/blob/96852e8860138a482cb13d1479573f24ff6443c6/config/src/main/java/org/springframework/security/config/annotation/authentication/configuration/InitializeUserDetailsBeanManagerConfigurer.java#L70-L106","documentation":"When the global AuthenticationManager would otherwise be built from a UserDetailsService bean, InitializeUserDetailsBeanManagerConfigurer looks for exactly one such bean. If it finds more than one, it cannot pick one, skips auto-configuration of username/password login entirely, and logs this warning listing the bean names and count.","triggerScenarios":"Declaring two or more UserDetailsService beans in the ApplicationContext (e.g. two @Bean methods or @Component services implementing UserDetailsService) with no explicit AuthenticationProvider/AuthenticationManager configured, then triggering AuthenticationManager initialization.","commonSituations":"Having both a Spring Boot auto-configured InMemoryUserDetailsManager and an app-defined UserDetailsService; multiple modules each publishing their own UserDetailsService; test configurations importing extra user-details beans.","solutions":["Publish exactly one UserDetailsService bean; delete or @Primary-free consolidate the duplicates.","Mark the intended bean @Primary so only it is considered, and remove or rename the others.","If multiple are needed, build the AuthenticationManager explicitly (e.g. AuthenticationManagerBuilder or a DaoAuthenticationProvider per store) instead of relying on auto-configuration."],"exampleFix":"// before\n@Bean UserDetailsService ldapUds() { return new LdapUserDetailsService(); }\n@Bean UserDetailsService dbUds() { return new JdbcUserDetailsService(); }\n\n// after\n@Bean\n@Primary\nUserDetailsService dbUds() { return new JdbcUserDetailsService(); }","handlingStrategy":"validation","validationCode":"String[] names = ctx.getBeanNamesForType(UserDetailsService.class);\nif (names.length > 1) {\n    throw new IllegalStateException(\"Expected exactly one UserDetailsService bean, found: \" + Arrays.toString(names));\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Publish exactly one UserDetailsService bean, marked @Primary if others exist.","Watch for auto-configured InMemoryUserDetailsManager duplicating your own bean.","Prefer an explicit AuthenticationManager when multiple user stores are genuinely required."],"tags":["spring-security","authentication","bean-ambiguity","auto-configuration"],"backgroundTag":"conflicting-config-options","analyzedSha":"96852e8860138a482cb13d1479573f24ff6443c6","analyzedAt":"2026-09-10T23:25:23.477Z","contentChangedAt":"2026-09-10T23:25:23.477Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}