![](/img/trans.png)
[英]Spring security 4 - configure(AuthenticationManagerBuilder auth) works without @Autowired
[英]How Spring Security add/configure AuthenticationManagerBuilder?
我正在開發基於Spring Security Java的配置。
我創建了自己的MyAuthenticationProvider
,我想在ProviderManager
( AuthenticationManager
單個實例)中注冊。
我發現ProviderManager
有一個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
auth? AuthenticationManagerBuilder
是否已在應用程序上下文中創建? AuthenticationManagerBuilder
的默認狀態是什么? 默認狀態我的意思是會有一些parentAuthenticationManager
, authenticationProvider
已經在AuthenticationManagerBuilder
注冊了嗎? auth.authenticationProvider(MyAuthenticationProvider)
,這是否意味着我在AuthenticationManagerBuilder
添加了一個提供程序? 這是什么意思? 摘自Spring文檔
configureGlobal方法的名稱並不重要。 但是,僅在使用@EnableWebSecurity,@ EnableWebMvcSecurity,@ EnableGlobalMethodSecurity或@EnableGlobalAuthentication注釋的類中配置AuthenticationManagerBuilder非常重要。 否則會產生不可預測的結果。
回答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);
}
}
“否則會產生不可預測的結果”
如果保留名稱但不保留注釋,則可能不起作用。
@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,...身份驗證。
背景:
春季安全的Java配置要經過幾個階段與無縫地整合你的配置ApplicationContext
。一是地方,這個走到一起是在getHttp()
的方法WebSecurityConfigurerAdapter
。
例如,這是一段摘錄:
AuthenticationManager authenticationManager = authenticationManager();
authenticationBuilder.parentAuthenticationManager(authenticationManager);
為了讓您了解配置順序的“不直接”,上面的authenticationManager變量將是:
configure(AuthenticationManagerBuilder auth)
添加的身份驗證管理器 AuthenticationManagerBuilder
中@Autowired
AuthenticationManagerBuilder
bean的方法中添加的身份驗證管理器 默認情況下,我的意思是在
AuthenticationManagerBuilder
已經注冊了一些authenticationProviders
如果查看AuthenticationConfiguration
,您將看到默認情況下, InitializeUserDetailsBeanManagerConfigurer
應用於AuthenticationManagerBuilder
bean。 只要它在上下文中找到UserDetailsService
bean並且沒有添加其他提供者,它就會添加一個DaoAuthenticationProvider
。 這就是為什么在Spring Security引用中 ,只提供@Bean UserDetailsService
bean就足夠了。
但是,一旦像您一樣添加身份驗證提供程序,“默認”提供程序就不會注冊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.