java-无法在GlobalMethodSecurityConfiguration中自动装配UserDetailsService
作者:互联网
我收到java.lang.IllegalArgumentException:尝试在我的SecurityConfig Java Config类中自动绑定自定义UserDetailsService实现时,必须设置UserDetailsService.这是我的配置类的概述.
根配置
@Configuration
@Import(value = { SecurityConfig.class, ServiceConfig.class })
public class RootConfig
{
}
服务配置
@Configuration
@ComponentScan(value = "basepackage.service")
// this package includes the custom UserDetailsService implementation
// annotated by @Service
public class ServiceConfig
{
}
安全配置
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends GlobalMethodSecurityConfiguration
{
// this service is injected using setter injection, omitted for clarity
private UserDetailsService userDetailsService;
@Autowired
public void registerGlobal(AuthenticationManagerBuilder auth)
throws Exception
{
auth.userDetailsService(userDetailsService);
}
}
现在的问题是:有时(但有时只是-似乎是完全随机的),自定义UserDetailsService在methodSecurityInterceptor实例化之前未自动接线,并且我得到org.springframework.beans.factory.BeanCreationException:创建名称为“ methodSecurityInterceptor”的bean时出错在类basepackage.SecurityConfig …中定义,并且堆栈结束于
Caused by: java.lang.IllegalArgumentException: A UserDetailsService must be set
at org.springframework.util.Assert.notNull(Assert.java:112)
at org.springframework.security.authentication.dao.DaoAuthenticationProvider.doAfterPropertiesSet(DaoAuthenticationProvider.java:94)
如前所述,UserDetailsService实现使用@Service注释进行注释,并且应该由ServiceConfig以正确的顺序实例化.仅在部署应用程序时才会发生此问题.通常,一切都正确地实例化.当我使用@Bean批注在SecurityConfig内创建UserDetailsService Bean时,一切都很好.但是我更喜欢将服务bean与SecurityConfig分开.我尝试使用@Order批注进行尝试,但是没有成功.
任何想法为什么会发生这种情况?另外,为什么它随机发生而不是每次发生?为什么Spring不能以正确的顺序实例化bean?多谢您的协助.
解决方法:
我正在处理完全相同的问题.有趣的是,它仅发生在Java 8中;如果我使用Java 7,问题就解决了.我从Java 8开始使用LocalDate的一些东西,因此不再是一种选择.
无论如何,我并没有希望能够自动将其连接,并且确实希望我的服务保持在一起,因此我没有将其自动装配,而是将其提供给AuthenticationManagerBuilder(我向CustomUserDetailsService添加了构造函数).然后,您可以将服务保留在服务包中.当然,那时候您不会将其注释为服务,这可能会破坏您的整个目标,因为它在春季左右就可以工作了,但我认为我还是会发布该选项.
@Autowired
public void configureGlobal( AuthenticationManagerBuilder auth ) throws Exception
{
auth
.userDetailsService( new CustomUserDetailsService() )
.passwordEncoder( passwordEncoder() );
}
标签:spring-java-config,spring-security,autowired,spring,java 来源: https://codeday.me/bug/20191029/1958618.html