Spring Security如何添加/配置AuthenticationManagerBuilder?

时间:2014-09-20 11:05:51

标签: java spring-security

我正在开发基于Spring Security Java的配置。

我创建了自己的MyAuthenticationProvider,我想在ProviderManagerAuthenticationManager的单个实例)中注册。

我发现ProviderManager有一个我可以注册单身的提供者列表 MyAuthenticationProvider

以下是我的配置部分:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

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

我发现AuthenticationManagerBuilderparentAuthenticationManagerdefaultUserDetailsService和许多其他字段。

我的问题是:

  1. @Autowired注释添加AuthenticationManagerBuilder身份验证的位置在哪里? 是否已在应用程序上下文中创建AuthenticationManagerBuilder
  2. 正在注入的AuthenticationManagerBuilder的默认状态是什么?默认情况下,我的意思是parentAuthenticationManager已经注册了一些authenticationProviderAuthenticationManagerBuilder
  3. 如果我要添加auth.authenticationProvider(MyAuthenticationProvider),这是否意味着我要在AuthenticationManagerBuilder添加一个提供商?
  4. 这是什么意思?摘自Spring文档

      

    configureGlobal方法的名称并不重要。但是,它   仅在类中配置AuthenticationManagerBuilder非常重要   用@EnableWebSecurity,@ EnableWebMvcSecurity注释,   @EnableGlobalMethodSecurity或@EnableGlobalAuthentication。干   否则会产生不可预测的结果。

2 个答案:

答案 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)

答案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) {
    ...
}

当您@AutowireAuthenticationManagerBuilder时,这就是您将得到的。您可以使用多种方法轻松配置内存,jdbc,ldap等身份验证。

答案2:

背景

Spring Security Java配置经历了多个阶段,以无缝地将您的配置与ApplicationContext合并。其中一个合并在一起的地方是getHttp()中的WebSecurityConfigurerAdapter方法。

例如,这是节选:

AuthenticationManager authenticationManager = authenticationManager();

authenticationBuilder.parentAuthenticationManager(authenticationManager);

要让您了解配置顺序的“不直观”,上面的authenticationManager变量将为:

  • 您通过覆盖configure(AuthenticationManagerBuilder auth)
  • 添加的身份验证管理器
  • OR:您在通过AuthenticationConfiguration @Autowired AuthenticationManagerBuilder bean的方法中添加的身份验证管理器
  • OR:在上下文中找到的AuthenticationManager bean
  

默认情况下,我的意思是在AuthenticationManagerBuilder中已经注册了一些authenticationProviders ...

如果您查看AuthenticationConfiguration,则会发现默认情况下,InitializeUserDetailsBeanManagerConfigurer已应用于AuthenticationManagerBuilder bean。只要它在上下文中找到一个UserDetailsService bean,并且没有添加任何其他提供程序,它将添加一个DaoAuthenticationProvider。这就是为什么在Spring Security reference中,仅提供@Bean UserDetailsService bean就足够了。

但是,一旦像添加身份验证提供程序一样,就不会注册“默认”提供程序。