gpt4 book ai didi

java - 无法在 GlobalMethodSecurityConfiguration 中 Autowiring UserDetailsS​​ervice

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:46:22 26 4
gpt4 key购买 nike

当我尝试在我的 SecurityConfig Java 配置类中 Autowiring 自定义 UserDetailsS​​ervice 实现时,我得到了 java.lang.IllegalArgumentException: A UserDetailsS​​ervice must be set。这是我的配置类的概述。

根配置

@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 实例化之前没有 Autowiring ,我得到了 org.springframework.beans .factory.BeanCreationException:创建类 basepackage.SecurityConfig 中定义的名为“methodSecurityInterceptor”的 bean 时出错... 堆栈结束于

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 东西,所以这不再是一个选项。

无论如何,我最终无法 Autowiring 它,我确实希望我的服务保持在一起,所以我没有 Autowiring 它,而是将它提供给 AuthenticationManagerBuilder(我向我的 CustomUserDetailsS​​ervice 添加了一个构造函数)。然后您可以将您的服务保留在您的服务包中。当然,你不会在那时将它注释为服务,这可能会破坏你的整个目的,因为它在 Spring 左右起作用,但我想我还是会发布这个选项。

@Autowired
public void configureGlobal( AuthenticationManagerBuilder auth ) throws Exception
{
auth
.userDetailsService( new CustomUserDetailsService() )
.passwordEncoder( passwordEncoder() );
}

关于java - 无法在 GlobalMethodSecurityConfiguration 中 Autowiring UserDetailsS​​ervice,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25230445/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com