ActiveDirectoryLdapAuthenticationProvider |Как предоставить основные кредиты - PullRequest
0 голосов
/ 10 октября 2018
  1. Я работаю над приложением весенней загрузки.Я поражен тем, как установить основные учетные данные в поставщике аутентификации AuthenticationManagerBuilder, объект ActiveDirectoryLdapAuthenticationProvider.Он просто имеет setSearchFilter, чтобы найти, если пользователь присутствует в группе.Но как предоставляются основные учетные данные для аутентификации веб-пользователей?Я заметил, что когда я предоставляю правильные учетные данные, для перезагрузки требуется больше 2 секунд, но аутентификация все равно не выполняется: (login?error redirection).Но для неправильных учетных данных выдается сообщение о неверном пароле.

  2. Кроме того, как переопределить имя пользователя с идентификатором электронной почты на имя samaccountname?

  3. (&(objectClass=user)(userPrincipalName={0})(memberOf=groupname)) - это терпит неудачу, что здесь означает userPrincipalName={0}?

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception
    {
    
        ActiveDirectoryLdapAuthenticationProvider adProvider = 
                new ActiveDirectoryLdapAuthenticationProvider(domain, url, userBaseDn);
    
        adProvider.setConvertSubErrorCodesToExceptions(true);
        adProvider.setUseAuthenticationRequestCredentials(true);
    
        // set pattern if it exists
        // The following example would authenticate a user if they were a member
        // of the ServiceAccounts group
        // (&(objectClass=user)(userPrincipalName={0})
        //   (memberof=CN=ServiceAccounts,OU=alfresco,DC=mycompany,DC=com))
    
        if (userDnPattern != null && userDnPattern.trim().length() > 0)
        {
            adProvider.setSearchFilter(userDnPattern);
        }
        auth.authenticationProvider(adProvider);
    
        // don't erase credentials if you plan to get them later
        // (e.g using them for another web service call)
        auth.eraseCredentials(false);
     }
    

1 Ответ

0 голосов
/ 25 июля 2019

Я могу ответить на некоторые ваши вопросы, но поделюсь вашим основным вопросом.

Ответы на вопросы 2 и 3.

(&(objectClass=user)(userPrincipalName={0})

- это фильтр поиска по умолчанию, который можно заменить на

sAMAccountName={0}

для фильтра, если вы обнаружите, что он работает для вашей настройки.

((&cn={0}))  // works for me

Это просто сопоставление с полями в записи AD, возвращенной через LDAP, и выражение {0}где идентификационный номер будет подставлен при поиске.Вы должны настроить этот оператор так, чтобы он соответствовал структуре каталогов и фильтрации, которые вы хотите применить к своему поиску по Active Directory.Если указать слишком мало или недостаточно конкретные критерии фильтрации, возникнет исключение, например:

Ожидается 1, но найдено 5

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

Однако, если вычтобы открыть для этого другой класс Spring, этот ответ подчеркивает расширение GlobalAuthenticationConfigurerAdapter в качестве вложенного класса для WebSecurityConfigurerAdapter, и с этим вы можете установить базовое DN:

 contextSource.setBase("OU=MyCo Global,DC=myco");

Полный код взят из примера, указанного выше:

@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/css/**").permitAll().anyRequest()
                .fullyAuthenticated().and().formLogin();
    }

    @Configuration
    protected static class AuthenticationConfiguration extends
            GlobalAuthenticationConfigurerAdapter {

        @Override
        public void init(AuthenticationManagerBuilder auth) throws Exception {              
            DefaultSpringSecurityContextSource contextSource = new DefaultSpringSecurityContextSource("ldap://<url>");
            contextSource.setUserDn("<username>");
            contextSource.setPassword("<password>");
            contextSource.setReferral("follow"); 
            contextSource.afterPropertiesSet();

            LdapAuthenticationProviderConfigurer<AuthenticationManagerBuilder> ldapAuthenticationProviderConfigurer = auth.ldapAuthentication();

            ldapAuthenticationProviderConfigurer
                .userSearchFilter("(&(cn={0}))")
                .userSearchBase("")
                .contextSource(contextSource);
        }
    }
}
...