我需要使用自定义的LdapAuthenticationProvider,仅需进行一点更改,即可执行身份验证,需要满足一定的先决条件。
我基本上想要的是:
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
if (!precondition) {
throw new DisabledException("");
}
return super.authenticate(authentication);
}
我的WebSecurityConfigurerAdapter:
@Autowired
protected void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth
.userDetailsService(userDetailsService)
.passwordEncoder(encoder);
if (ldapSecurityConfig.isLdapEnabled()) {
auth
.ldapAuthentication()
.contextSource(ldapContextSource)
.userSearchFilter(ldapSecurityConfig.getUserSearchFilter())
.ldapAuthoritiesPopulator(ldapAuthoritiesPopulator)
.userDetailsContextMapper(userDetailsContextMapper);
}
}
问题是,那条线
auth.ldapAuthentication()
创建一个LdapAuthenticationProviderConfigurer对象,其构建方法实例化一个LdapAuthenticationProvider对象:
LdapAuthenticationProvider ldapAuthenticationProvider = new LdapAuthenticationProvider(ldapAuthenticator, authoritiesPopulator);
似乎我无法控制最后使用哪个LdapAuthenticationProvider。
作为一种解决方法,我可以检查UserDetailsContextMapper对象中的前提条件,如果不满足则抛出异常,但这不是最佳选择,因为在这种情况下,即使不需要LDAP服务器,也会对其进行查询。
我的问题是,如何强制使用自定义提供程序,或者是否有其他“简单”方式来实现我想要的行为?