Spring security Spring Security Java配置-自定义身份验证提供程序和UserDetailsService

Spring security Spring Security Java配置-自定义身份验证提供程序和UserDetailsService,spring-security,spring-java-config,Spring Security,Spring Java Config,我使用java配置来配置Spring安全性,并且我有定制的AuthenticationProvider和定制的UserDetailsService,以便在下面添加额外的登录字段 我很难使用java配置将这两个自定义类添加到Spring安全框架中。 正如AuthenticationProvider的java文档#AuthenticationProvider所描述的: 添加基于以下内容的自定义AuthenticationProvider的身份验证: 他被传了进来。因为AuthenticationP

我使用java配置来配置Spring安全性,并且我有定制的AuthenticationProvider和定制的UserDetailsService,以便在下面添加额外的登录字段

我很难使用java配置将这两个自定义类添加到Spring安全框架中。 正如AuthenticationProvider的java文档#AuthenticationProvider所描述的:

添加基于以下内容的自定义AuthenticationProvider的身份验证: 他被传了进来。因为AuthenticationProvider实现是 未知,所有自定义必须在外部完成,并且 AuthenticationManagerBuilder将立即返回

此方法无法确保UserDetailsService可用 用于getDefaultUserDetailsService()方法


因此,我的问题是,在这种情况下,设置UserDetailsService的方法是什么?

以下是自定义AuthenticationProvider和自定义UserDetailsService的示例:

@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void registerGlobalAuthentication(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(customAuthenticationProvider());
    }

    @Bean
    AuthenticationProvider customAuthenticationProvider() {
        CustomAuthenticationProvider impl = new CustomAuthenticationProvider();
        impl.setUserDetailsService(customUserDetailsService());
        /* other properties etc */
        return impl ;
    }

    @Bean   
    UserDetailsService customUserDetailsService() {
        /* custom UserDetailsService code here */
    }
}

我注意到您手动初始化了
customAuthenticationProvider
CustomUserDetails服务
,直接
@Autowired
它们不是更好吗?
@Autowired
@Configuration
类中使用,当您在bean外部布线时。在此代码中,
customAuthenticationProvider
customUserDetailsService
bean在同一个类中声明,因此
@Autowired
没有用例。还要注意,
AuthenticationManagerBuilder
在其他地方声明,因此可以使用
@Autowired
.impl.setUserDetailsService(customUserDetailsService());//这将不起作用,-AuthenticationProvider接口没有setUserDetailsService()方法。由于它是自定义AuthenticationProvider实现,您可以添加此方法(毕竟任何身份验证提供程序都需要一种机制来加载用户详细信息)。请参阅
AuthenticationProvider
的实现,例如,它具有
setUserDetailsService
方法。