Spring Конфигурация Java для LDAPTemplate.ignorePartialResultException

Извиняюсь за длинный вопрос, но, короче говоря, мне интересно, как установить флаг org.springframework.ldap.core.LdapTemplate#ignorePartialResultException с помощью Spring Java Config.

Длинный вопрос - это...

Я хочу использовать Active Directory наших компаний для аутентификации (под этим я подразумеваю проверку пользователя/пароля) для начала, а затем, после этого, для авторизации (такие роли, которые у них есть разрешение использовать).

Я взял руководство по Spring LDAP и внес изменения для подключения в Active Directory наших компаний вместо использования LDIF-файла руководства. Из отладки я знаю, что программа подключается к Active Directory и правильно аутентифицирует пользователя, но при получении полномочий я получаю следующее исключение:

Unprocessed Continuation Reference(s); nested exception is javax.naming.PartialResultException

Из поиска в Google я увидел, что это обычная проблема LDAP/ActiveDirectory, и мне нужно установить флаги, чтобы игнорировать ссылки. Я следовал примеру из этот вопрос SO< /а>. Однако я все еще получаю исключение, и из отладки я вижу, что ошибка возникает в следующем методе при поиске ролей для пользователя.

org.springframework.ldap.core.LdapTemplate#search(org.springframework.ldap.core.SearchExecutor, org.springframework.ldap.core.NameClassPairCallbackHandler, org.springframework.ldap.core.DirContextProcessor) 

Для справки мой файл WebSecurityConfig:

    @Bean
    public BaseLdapPathContextSource contextSource() throws Exception {
        DefaultSpringSecurityContextSource contextSource = new DefaultSpringSecurityContextSource("ldap://<ad-host>:389/");

        contextSource.setUserDn(/*principleCN*/);
        contextSource.setPassword(/*principlePassword*/);
        contextSource.setReferral("ignore"); 
        contextSource.afterPropertiesSet();

        return contextSource;
    }

    @Override
    public void init(AuthenticationManagerBuilder auth) throws Exception {
        auth.ldapAuthentication()
                .userSearchFilter("(&(sAMAccountName={0})(objectclass=user))")
                .userSearchBase("dc=<company>,dc=local")
                .groupSearchBase("dc=<company>,dc=local")
                .contextSource(contextSource());
    }

person user1232555    schedule 17.12.2014    source источник


Ответы (1)


Я могу сказать, что вы можете добиться этого с помощью DefaultLdapAuthoritiesPopulator, у него есть метод setIgnorePartialResultException(boolean) для достижения именно этого.

Итак, в вашем классе конфигурации вам нужно будет сделать что-то вроде следующих строк:

@Bean
public LdapAuthoritiesPopulator ldapAuthoritiesPopulator() throws Exception {
    DefaultLdapAuthoritiesPopulator populator = new DefaultLdapAuthoritiesPopulator(contextSource(), "dc=<company>,dc=local");
    populator.setIgnorePartialResultException(true);
    return populator;
}

@Override
public void init(AuthenticationManagerBuilder auth) throws Exception {
    auth.ldapAuthentication()
            .userSearchFilter("(&(sAMAccountName={0})(objectclass=user))")
            .userSearchBase("dc=<company>,dc=local")
            .contextSource(contextSource())
            .ldapAuthoritiesPopulator(ldapAuthoritiesPopulator());
}

Одно предостережение заключается в том, что я явно не тестировал это, поэтому вам может понадобиться немного поиграть с вашей конфигурацией.

person DB5    schedule 19.12.2014
comment
в ldapAuthoritiesPopulator откуда берется contextSource()? - person JavaSheriff; 16.04.2019
comment
@ user648026, это метод, который возвращает BaseLdapPathContextSource. Он определен в вопросе @user1232555 в классе WebSecurityConfig. Мой ответ был дан, чтобы соответствовать их вопросу. - person DB5; 16.04.2019