我正在设置我的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
方法在内部配置它。我怎么能设法让它发挥作用?
答案 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,因为我从未(成功)尝试过代码配置