spring security 无法添加自定义身份验证提供程序
Posted
技术标签:
【中文标题】spring security 无法添加自定义身份验证提供程序【英文标题】:spring security not able to add custom authentication providers 【发布时间】:2016-01-06 14:02:55 【问题描述】:我创建了额外的身份验证提供程序。我正在注册它们,如下所示:
@Configuration
@EnableWebMvcSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
class SecurityConfig extends WebSecurityConfigurerAdapter
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception
auth.authenticationProvider(tokenAP());
auth.authenticationProvider(usernameAndPasswordAP());
auth.userDetailsService(getUserDetailsService());
稍后在我的代码中,我使用 AuthenticationManager 对用户进行身份验证。问题是我在身份验证管理器中只注册了一个身份验证提供程序,即 DaoAuthenticationProvider。看起来我的身份验证提供程序根本没有注册。我应该做一些额外的配置来使它工作吗?我正在使用 spring boot 1.2.6 提前感谢任何提示。最好的问候
【问题讨论】:
【参考方案1】:当您覆盖 configure(AuthenticationManagerBuilder auth)
时,底层 AuthenticationManager 会以以下两种方式之一公开:
1) 在SecurityConfig中,您可以简单地调用authenticationManager()
2) 如果您需要在 SecurityConfig 之外使用 AuthenticationManager,则需要将其公开为 bean,例如:
class SecurityConfig extends WebSecurityConfigurerAdapter
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception
auth.authenticationProvider(tokenAP());
auth.authenticationProvider(usernameAndPasswordAP());
auth.userDetailsService(getUserDetailsService());
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception
return super.authenticationManagerBean();
【讨论】:
【参考方案2】:我们在 Spring Boot Web 应用程序中配置身份验证提供程序的方式类似于 the example Spring Security Java configuration from the current release reference guide 中讨论的内容,它修改了默认的自动连接 AuthenticationManagerBuilder
。使用您的方法,它可能看起来像:
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception
auth.authenticationProvider(tokenAP())
.authenticationProvider(usernameAndPasswordAP())
.userDetailsService(getUserDetailsService());
如果我正确阅读the Javadocs for the configure(AuthenticationManagerBuilder) method,当您覆盖此方法时,您必须指定您自己的AuthenticationManager
。通过使用如上所述的自动装配实例,默认的AuthenticationManager
(即ProviderManager
,又委托给一个或多个已配置的AuthorizationProvider
实例)。
您可能还需要注释您的配置类:
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
这样您的访问控制规则就会在 Spring Boot 否则为您配置的默认值之前应用。
【讨论】:
以上是关于spring security 无法添加自定义身份验证提供程序的主要内容,如果未能解决你的问题,请参考以下文章
在 spring-security 的身份验证中无法获取自定义信息
使用 Acegi/Spring Security 创建自定义身份验证
Spring Security 和 Keycloak 因自定义身份验证提供程序而失败
Grails:Spring Security Core 自定义身份验证 getUserByUserName 返回 null 对象