我正在设置我的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
方法在内部配置它。我如何才能让它工作呢?
3条答案
按热度按时间w7t8yxp51#
您可以手动创建您的
InMemoryUserDetailsManagerConfigurer
,并告诉它在您完成配置后在AuthenticationManagerBuilder
上进行自我配置,以便它在您的自定义AuthenticationProvider
之前安装它的AuthenticationProvider
:通常情况下,
InMemoryUserDetailsManagerConfigurer
被创建并添加到构建AuthenticationManager
时应该应用的配置器列表中--这是在您安装了自定义的AuthenticationProvider
之后。yi0zb3m42#
与spring.io Documentation相差不大
如果您使用XML配置(例如spring-security.xml):
(我将该设置用于Spring的一个内置身份验证提供程序,紧挨着一个自定义身份验证提供程序,工作正常)
如果您使用的是JavaConfig,我只能引用其他人的帖子maclema on Java config for multiple authentication provider,因为我从来没有(成功地)尝试过代码config
jgzswidk3#
现在我们倾向于通过
WebSecurityConfigurerAdapter
来配置Spring Security,您可以注册从请求中提取凭证的过滤器,并注册使用过滤器构建的令牌的提供者,方法是使用其他详细信息(如权限)填充Authentication
对象: