【问题标题】:In memory and custom providers all together在内存和自定义提供程序中
【发布时间】:2015-09-05 02:03:33
【问题描述】:

我正在设置我的 Spring Security (v4.0.1) Web 应用程序。我想要两个身份验证提供程序,一个用于管理管理员帐户的“内存中”提供程序,另一个是我自己的实现的自定义提供程序。系统应该首先尝试对“内存中”提供者进行身份验证,然后对自定义提供者进行身份验证。我的代码如下所示:

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth, 
    AuthenticationProvider provider) throws Exception {
    auth.inMemoryAuthentication()
            .withUser("admin")
            .password("s3cr3t")
            .authorities("ADMIN");
    auth.authenticationProvider(provider);
}

但是,此代码导致框架首先尝试我的自定义实现。这有点道理,因为AuthenticationManagerBuilder#authenticationProvider 方法将提供程序添加到内部列表中,而AuthenticationManagerBuilder#inMemoryAuthentication 方法在内部对其进行配置。我怎样才能让它发挥作用?

【问题讨论】:

    标签: java spring-security


    【解决方案1】:

    您可以手动创建您的InMemoryUserDetailsManagerConfigurer,并在您完成配置后告诉它在AuthenticationManagerBuilder 上进行自我配置,以便在您的自定义之前安装AuthenticationProvider

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth,
            AuthenticationProvider provider) throws Exception {
    
        inMemoryConfigurer()
            .withUser("admin")
                .password("s3cr3t")
                .authorities("ADMIN")
            .and()
            .configure(auth);
        auth.authenticationProvider(provider);
    }
    
    private InMemoryUserDetailsManagerConfigurer<AuthenticationManagerBuilder>
            inMemoryConfigurer() {
        return new InMemoryUserDetailsManagerConfigurer<>();
    }
    

    通常情况下,InMemoryUserDetailsManagerConfigurer 会创建并添加到应在构建 AuthenticationManager 时应用的配置器列表中 - 这是在您安装自定义 AuthenticationProvider 之后。

    【讨论】:

      【解决方案2】:

      或多或少来自spring.io Documentation

      如果您使用的是 XML 配置(例如 spring-security.xml):

      <security:authentication-manager>
          <security:authentication-provider ref="FirstProvider" />
          <security:authentication-provider ref="SecondProvider" />
      </security:authentication-manager>
      

      (我将该设置用于 Spring 的内置身份验证提供程序之一,旁边是自定义提供程序,工作正常)

      如果您使用的是 Java Config,我只能参考其他人的帖子maclema on Java config for multiple authentication provider,因为我从未(成功)尝试过代码配置

      【讨论】:

      • 感谢您的回答,我没有使用 XML 配置。我想要实现的是与您的链接答案类似的东西,但是我没有两个自定义身份验证提供程序,而是有一个自定义身份验证提供程序和另一个由 Spring 提供的内存中身份验证提供程序。由于内存中的一个是在 AuthenticationManagerBuilder 上定义的,我不知道如何添加它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      • 2021-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-10
      相关资源
      最近更新 更多