编程语言
首页 > 编程语言> > java-无法在GlobalMethodSecurityConfiguration中自动装配UserDetailsS​​ervice

java-无法在GlobalMethodSecurityConfiguration中自动装配UserDetailsS​​ervice

作者:互联网

我收到java.lang.IllegalArgumentException:尝试在我的SecurityConfig Java Config类中自动绑定自定义UserDetailsS​​ervice实现时,必须设置UserDetailsS​​ervice.这是我的配置类的概述.

根配置

@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);
    }
}

现在的问题是:有时(但有时只是-似乎是完全随机的),自定义UserDetailsS​​ervice在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)

如前所述,UserDetailsS​​ervice实现使用@Service注释进行注释,并且应该由ServiceConfig以正确的顺序实例化.仅在部署应用程序时才会发生此问题.通常,一切都正确地实例化.当我使用@Bean批注在SecurityConfig内创建UserDetailsS​​ervice Bean时,一切都很好.但是我更喜欢将服务bean与SecurityConfig分开.我尝试使用@Order批注进行尝试,但是没有成功.

任何想法为什么会发生这种情况?另外,为什么它随机发生而不是每次发生?为什么Spring不能以正确的顺序实例化bean?多谢您的协助.

解决方法:

我正在处理完全相同的问题.有趣的是,它仅发生在Java 8中;如果我使用Java 7,问题就解决了.我从Java 8开始使用LocalDate的一些东西,因此不再是一种选择.

无论如何,我并没有希望能够自动将其连接,并且确实希望我的服务保持在一起,因此我没有将其自动装配,而是将其提供给AuthenticationManagerBuilder(我向CustomUserDetailsS​​ervice添加了构造函数).然后,您可以将服务保留在服务包中.当然,那时候您不会将其注释为服务,这可能会破坏您的整个目标,因为它在春季左右就可以工作了,但我认为我还是会发布该选项.

@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