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

时间:2015-06-19 07:17:00

标签: java spring-security

我正在设置我的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方法将Provider添加到内部List,而AuthenticationManagerBuilder#inMemoryAuthentication方法在内部配置它。我怎么能设法让它发挥作用?

2 个答案:

答案 0 :(得分:23)

您可以手动创建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时应用 - 这是在您安装自定义{{1}之后}。

答案 1 :(得分:3)

或多或少来自spring.io Documentation

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

dt <- dt[-i] # exclude row i from the data.table

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

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