簡體   English   中英

Spring Security如何添加/配置AuthenticationManagerBuilder?

[英]How Spring Security add/configure AuthenticationManagerBuilder?

我正在開發基於Spring Security Java的配置。

我創建了自己的MyAuthenticationProvider ,我想在ProviderManagerAuthenticationManager單個實例)中注冊。

我發現ProviderManager有一個ProviderManager列表,我可以在其中注冊我的單個MyAuthenticationProvider

這是我配置的一部分:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(MyAuthenticationProvider);
    }
}

我發現AuthenticationManagerBuilderparentAuthenticationManagerdefaultUserDetailsService和許多其他字段。

我的問題是:

  1. 這個@Autowired注釋在哪里添加了AuthenticationManagerBuilder auth? AuthenticationManagerBuilder是否已在應用程序上下文中創建?
  2. 正在注入的AuthenticationManagerBuilder的默認狀態是什么? 默認狀態我的意思是會有一些parentAuthenticationManagerauthenticationProvider已經在AuthenticationManagerBuilder注冊了嗎?
  3. 如果我要添加auth.authenticationProvider(MyAuthenticationProvider) ,這是否意味着我在AuthenticationManagerBuilder添加了一個提供程序?
  4. 這是什么意思? 摘自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);
    }
}

“否則會產生不可預測的結果”

如果保留名稱但不保留注釋,則可能不起作用。

答案為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,...身份驗證。

回答2:

背景:

春季安全的Java配置要經過幾個階段與無縫地整合你的配置ApplicationContext 。一是地方,這個走到一起是在getHttp()的方法WebSecurityConfigurerAdapter

例如,這是一段摘錄:

AuthenticationManager authenticationManager = authenticationManager();

authenticationBuilder.parentAuthenticationManager(authenticationManager);

為了讓您了解配置順序的“不直接”,上面的authenticationManager變量將是:

  • 您通過覆蓋configure(AuthenticationManagerBuilder auth)添加的身份驗證管理器
  • 或者:您在AuthenticationManagerBuilder@Autowired AuthenticationManagerBuilder bean的方法中添加的身份驗證管理器
  • OR:在上下文中找到的AuthenticationManager bean

默認情況下,我的意思是在AuthenticationManagerBuilder已經注冊了一些authenticationProviders

如果查看AuthenticationConfiguration ,您將看到默認情況下, InitializeUserDetailsBeanManagerConfigurer應用於AuthenticationManagerBuilder bean。 只要它在上下文中找到UserDetailsService bean並且沒有添加其他提供者,它就會添加一個DaoAuthenticationProvider 這就是為什么在Spring Security引用中 ,只提供@Bean UserDetailsService bean就足夠了。

但是,一旦像您一樣添加身份驗證提供程序,“默認”提供程序就不會注冊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM