在内存和自定义提供程序中

2022-09-03 18:26:32

我正在设置我的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);
}

但是,此代码引导框架首先尝试我的自定义实现。这有点意义,因为AuthorationManagerBuilder#authenticationProvider方法将提供程序添加到内部列表中,而AuthorationManagerBuilder#inMemoryAuthentication则在内部配置它。我怎样才能让它工作?


答案 1

您可以手动创建并告诉它在完成配置后自行配置,以便它在自定义之前安装:InMemoryUserDetailsManagerConfigurerAuthenticationManagerBuilderAuthenticationProvider

@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<>();
}

通常,发生的情况是创建并添加到构建时应应用的配置器列表中 - 这是在安装自定义之后。InMemoryUserDetailsManagerConfigurerAuthenticationManagerAuthenticationProvider


答案 2

或多或少来自 spring.io 文档

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

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

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

如果您使用的是Java Config,我只能引用其他人在Java配置上的maclema帖子,用于多重身份验证提供程序,因为我从来没有(成功)尝试过代码配置


推荐