【问题标题】:How Spring Security add/configure AuthenticationManagerBuilder?Spring Security 如何添加/配置 AuthenticationManagerBuilder?
【发布时间】:2014-11-14 21:14:27
【问题描述】:

我正在研究基于 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);
    }
}

发现AuthenticationManagerBuilderparentAuthenticationManagerdefaultUserDetailsService等很多字段。

我的问题是:

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

    configureGlobal 方法的名称并不重要。然而,它 仅在类中配置 AuthenticationManagerBuilder 很重要 使用 @EnableWebSecurity、@EnableWebMvcSecurity 进行注释, @EnableGlobalMethodSecurity 或 @EnableGlobalAuthentication。正在做 否则会产生不可预知的结果。

【问题讨论】:

    标签: java spring-security


    【解决方案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 无缝结合。其中一个地方是WebSecurityConfigurerAdapter 中的getHttp() 方法。

    例如,这是一段摘录:

    AuthenticationManager authenticationManager = authenticationManager();
    
    authenticationBuilder.parentAuthenticationManager(authenticationManager);
    

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

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

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

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

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

    【讨论】:

    • 请问您如何回答这个深奥的问题?您是否使用特定的 IDE 功能或 google 上的任何关键字?我喜欢你解释@NatFar 的方式
    • 谢谢!不幸的是,蛮力 - 在他们的 github repo 上浏览 Spring Security 源代码:)
    【解决方案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);
        }
    }
    

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

    如果您保留名称而不保留注释,则可能无法正常工作。

    【讨论】:

    • 顺便说一句,如果类有 @EnableWebSecurity 注释,则不必用 @Configuration 注释类
    • 不使用BCryptPasswordEncoder怎么办?我正在使用带盐的SHA3.Digest256,但我不确定如何在 AuthenticationManager 上设置它。
    猜你喜欢
    • 2017-08-13
    • 2017-07-08
    • 2020-03-25
    • 1970-01-01
    • 2018-04-14
    • 2011-02-10
    • 2015-10-10
    • 2012-01-23
    相关资源
    最近更新 更多