Spring Security如何添加/配置AuthorationManagerBuilder?

2022-09-03 06:52:57

我正在研究基于Java的Spring Security配置。

我已经创建了自己的,我想在(的单个实例)中注册。MyAuthenticationProviderProviderManagerAuthenticationManager

我发现有一个提供商列表,我可以注册我的单个。ProviderManagerMyAuthenticationProvider

这是我的配置的一部分:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

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

我发现有,和许多其他领域。AuthenticationManagerBuilderparentAuthenticationManagerdefaultUserDetailsService

我的问题是:

  1. 此注释从何处添加身份验证?是否已在应用程序上下文中创建?@AutowiredAuthenticationManagerBuilderAuthenticationManagerBuilder
  2. 正在注入的默认状态是什么?默认状态我的意思是会有一些,s已经在?AuthenticationManagerBuilderparentAuthenticationManagerauthenticationProviderAuthenticationManagerBuilder
  3. 如果我正在添加 ,这是否意味着我在 ?auth.authenticationProvider(MyAuthenticationProvider)AuthenticationManagerBuilder
  4. 这是什么意思?摘自春季文献

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


答案 1

回答 1:

@EnableWebSecurity是元注释@EnableGlobalAuthentication

...
@EnableGlobalAuthentication
@Configuration
public @interface EnableWebSecurity {
...

和进口 :@EnableGlobalAuthenticationAuthenticationConfiguration

...
@Import(AuthenticationConfiguration.class)
@Configuration
public @interface EnableGlobalAuthentication {
}

在 中,您将看到一个 Bean 被声明:AuthenticationConfigurationAuthenticationManagerBuilder

...
@Bean
public AuthenticationManagerBuilder authenticationManagerBuilder(
        ObjectPostProcessor<Object> objectPostProcessor, ApplicationContext context) {
    ...
}

当你和,这是你会得到的那个。您可以使用多种方法来轻松配置内存中,jdbc,ldap,...认证。@AutowireAuthenticationManagerBuilder

回答2:

背景:

Spring Security Java 配置经过几个阶段,以将您的配置与 .将这种情况结合在一起的一个地方是 中的方法。ApplicationContextgetHttp()WebSecurityConfigurerAdapter

例如,这是一个摘录:

AuthenticationManager authenticationManager = authenticationManager();

authenticationBuilder.parentAuthenticationManager(authenticationManager);

为了让您了解配置顺序的“不简单”程度,上面的 authenticationManager 变量将是:

  • 通过重写添加的身份验证管理器configure(AuthenticationManagerBuilder auth)
  • OR:您在方法中添加的身份验证管理器,该方法中的 Bean 来自身份验证配置@AutowiredAuthenticationManagerBuilder
  • OR:在上下文中找到的身份验证管理器 Bean

默认情况下,我的意思是会有一些[...]身份验证供应商已经在AuthenticationManagerBuilder

如果您查看 ,您将看到默认情况下,将 应用于 Bean。只要它在上下文中找到一个 Bean 并且没有添加其他提供程序,它就会添加一个 .这就是为什么在Spring Security参考中,仅提供@Bean豆就足够了。AuthenticationConfigurationInitializeUserDetailsBeanManagerConfigurerAuthenticationManagerBuilderUserDetailsServiceDaoAuthenticationProviderUserDetailsService

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


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

“否则会产生不可预测的结果”

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


推荐