Spring Security如何添加/配置AuthenticationManagerBuilder?

bei*_*man 12 java spring-security

我正在开发基于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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我发现AuthenticationManagerBuilderparentAuthenticationManager,defaultUserDetailsService等诸多领域.

我的问题是:

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

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

Nat*_*Far 8

回答1:

@EnableWebSecurity 元注释为 @EnableGlobalAuthentication

...
@EnableGlobalAuthentication
@Configuration
public @interface EnableWebSecurity {
...
Run Code Online (Sandbox Code Playgroud)

@EnableGlobalAuthentication进口AuthenticationConfiguration

...
@Import(AuthenticationConfiguration.class)
@Configuration
public @interface EnableGlobalAuthentication {
}
Run Code Online (Sandbox Code Playgroud)

在 中AuthenticationConfiguration,您将看到声明了一个AuthenticationManagerBuilderbean:

...
@Bean
public AuthenticationManagerBuilder authenticationManagerBuilder(
        ObjectPostProcessor<Object> objectPostProcessor, ApplicationContext context) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

回答2:

背景:

Spring Security Java 配置经历了几个阶段以将您的配置与ApplicationContext.a 中的getHttp()方法结合在一起WebSecurityConfigurerAdapter

例如,这是一个摘录:

AuthenticationManager authenticationManager = authenticationManager();

authenticationBuilder.parentAuthenticationManager(authenticationManager);
Run Code Online (Sandbox Code Playgroud)

为了让您了解配置序列的“不直接”程度,上面的 authenticationManager 变量将是:

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

默认状态下我的意思是会有一些 [...] authenticationProviders 已经注册在 AuthenticationManagerBuilder

如果您查看AuthenticationConfiguration,您会看到默认情况下,InitializeUserDetailsBeanManagerConfigurer应用于AuthenticationManagerBuilderbean。只要它UserDetailsService在上下文中找到一个bean 并且没有添加其他提供者,它就会添加一个DaoAuthenticationProvider. 这就是为什么在Spring Security 参考中,只提供一个 @Bean UserDetailsServicebean 就足够了。

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


Jon*_*ira 5

回答3:

是的。AuthenticationManagerBuilder 的代码添加您的提供程序:

public AuthenticationManagerBuilder authenticationProvider(AuthenticationProvider authenticationProvider) {
    this.authenticationProviders.add(authenticationProvider);
    return this;
}
Run Code Online (Sandbox Code Playgroud)

4的答案很简单:

这意味着,一旦您拥有该注释之一,您就可以根据需要命名您的方法:

@Configuration
@EnableWebSecurity  //or @EnableWebMvcSecurity or @EnableGlobalMethodSecurity....
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void myCoolMethodName(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(MyAuthenticationProvider);
    }
}
Run Code Online (Sandbox Code Playgroud)

“不这样做会产生不可预测的结果”

如果保留名称但不保留注释,则可能不起作用。

  • 顺便说一句,如果类具有“@EnableWebSecurity”注释,则不必使用“@Configuration”注释类 (2认同)