Spring Security:谁将AuthenticationManagerBuilder传递给WebSecurityConfigurerAdapter配置方法?

时间:2019-11-30 17:51:53

标签: java spring spring-mvc spring-security

所以我正在研究Spring Security的实现。我遇到了一段代码,无法理解。因此,根据文档,当我们要自定义Spring使用的AuthenticationManager时,必须重写以下方法。

protected void configure(AuthenticationManagerBuilder auth) throws java.lang.Exception

我的问题是谁正在调用此方法并在此处传递 AuthenticationManagerBuilder 实例。 我看到的工作示例不会创建/公开任何 AuthenticationManagerBuilder bean。

此外,我在文档中看到以下内容,

  

受保护的AuthenticationManager authenticationManager()                                                  引发java.lang.Exception获取要使用的AuthenticationManager。

     

默认   策略是如果configure(AuthenticationManagerBuilder)方法是   重写以使用传入的AuthenticationManagerBuilder。   否则,请按类型自动连接AuthenticationManager。

被覆盖的方法是一个空方法,这也许就是为什么我对正在做的事情/应该做的事情感到更加困惑的原因。

任何帮助/指针都将受到高度赞赏。我知道它有效,但似乎无法弄清楚。 非常感谢。

1 个答案:

答案 0 :(得分:1)

假设以下是您遇到的代码

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

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

请注意

  1. WebSecurityConfigurerAdapter提供了一个方便的基础 用于创建WebSecurityConfigurer实例的类。
  2. WebSecurityConfigurerAdapter实现是一个 Configuration,因为它带有@EnableWebSecurity

这里

@EnableWebSecurity使用@EnableGlobalAuthentication进行元注释

@Retention(value=RUNTIME)
 @Target(value=TYPE)
 @Documented
 @Import(value={WebSecurityConfiguration.class,org.springframework.security.config.annotation.web.configuration.SpringWebMvcImportSelector.class,org.springframework.security.config.annotation.web.configuration.OAuth2ImportSelector.class})
 @EnableGlobalAuthentication
 @Configuration
public @interface EnableWebSecurity

和@EnableGlobalAuthentication导入AuthenticationConfiguration

@Retention(value=RUNTIME)
 @Target(value=TYPE)
 @Documented
 @Import(value=AuthenticationConfiguration.class)
 @Configuration
public @interface EnableGlobalAuthentication

AuthenticationConfiguration包含以下代码,用于将AuthenticationManagerBuilder注册为Bean

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