我正在开发基于Spring Security Java的配置。
我创建了自己的MyAuthenticationProvider
,我想在ProviderManager
(AuthenticationManager
的单个实例)中注册。
我发现ProviderManager
有一个我可以注册单身的提供者列表
MyAuthenticationProvider
。
以下是我的配置部分:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(MyAuthenticationProvider);
}
}
我发现AuthenticationManagerBuilder
有parentAuthenticationManager
,defaultUserDetailsService
和许多其他字段。
我的问题是:
@Autowired
注释添加AuthenticationManagerBuilder
身份验证的位置在哪里?
是否已在应用程序上下文中创建AuthenticationManagerBuilder
?AuthenticationManagerBuilder
的默认状态是什么?默认情况下,我的意思是parentAuthenticationManager
已经注册了一些authenticationProvider
,AuthenticationManagerBuilder
?auth.authenticationProvider(MyAuthenticationProvider)
,这是否意味着我要在AuthenticationManagerBuilder
添加一个提供商?这是什么意思?摘自Spring文档
configureGlobal方法的名称并不重要。但是,它 仅在类中配置AuthenticationManagerBuilder非常重要 用@EnableWebSecurity,@ EnableWebMvcSecurity注释, @EnableGlobalMethodSecurity或@EnableGlobalAuthentication。干 否则会产生不可预测的结果。
答案 0 :(得分:2)
回答3:
是。 AuthenticationManagerBuilder的代码添加了您的提供者:
public AuthenticationManagerBuilder authenticationProvider(AuthenticationProvider authenticationProvider) {
this.authenticationProviders.add(authenticationProvider);
return this;
}
答案4很简单:
这意味着,一旦您拥有其中一个注释,就可以根据需要命名方法:
@Configuration
@EnableWebSecurity //or @EnableWebMvcSecurity or @EnableGlobalMethodSecurity....
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void myCoolMethodName(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(MyAuthenticationProvider);
}
}
“否则会产生不可预测的结果”
如果您保留名称但不保留注释,则可能无效。
答案 1 :(得分:1)
@EnableWebSecurity
用@EnableGlobalAuthentication
元注释
...
@EnableGlobalAuthentication
@Configuration
public @interface EnableWebSecurity {
...
和@EnableGlobalAuthentication
导入AuthenticationConfiguration
:
...
@Import(AuthenticationConfiguration.class)
@Configuration
public @interface EnableGlobalAuthentication {
}
在AuthenticationConfiguration
中,您将看到一个AuthenticationManagerBuilder
bean被声明:
...
@Bean
public AuthenticationManagerBuilder authenticationManagerBuilder(
ObjectPostProcessor<Object> objectPostProcessor, ApplicationContext context) {
...
}
当您@Autowire
和AuthenticationManagerBuilder
时,这就是您将得到的。您可以使用多种方法轻松配置内存,jdbc,ldap等身份验证。
背景:
Spring Security Java配置经历了多个阶段,以无缝地将您的配置与ApplicationContext
合并。其中一个合并在一起的地方是getHttp()
中的WebSecurityConfigurerAdapter
方法。
例如,这是节选:
AuthenticationManager authenticationManager = authenticationManager();
authenticationBuilder.parentAuthenticationManager(authenticationManager);
要让您了解配置顺序的“不直观”,上面的authenticationManager变量将为:
configure(AuthenticationManagerBuilder auth)
@Autowired
AuthenticationManagerBuilder
bean的方法中添加的身份验证管理器默认情况下,我的意思是在
AuthenticationManagerBuilder
中已经注册了一些authenticationProviders ...
如果您查看AuthenticationConfiguration
,则会发现默认情况下,InitializeUserDetailsBeanManagerConfigurer
已应用于AuthenticationManagerBuilder
bean。只要它在上下文中找到一个UserDetailsService
bean,并且没有添加任何其他提供程序,它将添加一个DaoAuthenticationProvider
。这就是为什么在Spring Security reference中,仅提供@Bean UserDetailsService
bean就足够了。
但是,一旦像添加身份验证提供程序一样,就不会注册“默认”提供程序。