#java #spring #spring-boot #spring-security
#java #spring #весенняя загрузка #spring-безопасность
Вопрос:
Мне нужно использовать пользовательский 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, даже если это не требуется.
Мой вопрос в том, как я могу заставить использовать моего пользовательского провайдера или есть какой-либо другой «простой» способ добиться желаемого поведения?
Комментарии:
1. Вы нашли решение?