春季安全性:自定义LdapAuthenticationProvider

时间:2019-03-28 15:01:35

标签: java spring spring-boot spring-security

我需要使用自定义的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服务器,也会对其进行查询。

我的问题是,如何强制使用自定义提供程序,或者是否有其他“简单”方式来实现我想要的行为?

0 个答案:

没有答案