Аутентификация Active Directory с помощью Spring Security возвращает неверные учетные данные для действительных пользователей, вызванные LDAP: код ошибки 49 - PullRequest
0 голосов
/ 20 декабря 2018

Я работаю над проектом весенней загрузки maven для аутентификации пользователей, имеющих имя пользователя и пароль.Микросервис должен возвращать true / false, если пользователь аутентифицирован.

The SecurityConfiguration.java

package com.app.config;

import java.util.Arrays;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.ProviderManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider;

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter{

    private static final Logger logger = LoggerFactory.getLogger(SecurityConfiguration.class);

    private String url = "ldaps://org.abc.in:3387";
    private String domain = "org.abc.in";
    private String userDNPattern = "CN=pan,OU=Users,OU=UCV,DC=org,DC=abc,DC=in";

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                        .authorizeRequests().antMatchers("/", "logout").permitAll();

    }


     @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {              
         auth.authenticationProvider(activeDirectoryLdapAuthenticationProvider());

        }

     @Bean
        public AuthenticationManager authenticationManager() {
         return new ProviderManager(Arrays.asList(activeDirectoryLdapAuthenticationProvider()));
        }

     @Bean
        public AuthenticationProvider activeDirectoryLdapAuthenticationProvider() {

            ActiveDirectoryLdapAuthenticationProvider adProvider = new ActiveDirectoryLdapAuthenticationProvider(domain, url);
            adProvider.setConvertSubErrorCodesToExceptions(true);
            adProvider.setUseAuthenticationRequestCredentials(true);
            //adProvider.setAuthoritiesMapper(new NullAuthoritiesMapper());
            return adProvider;
        }

}

Я вызываю следующий метод, передавая имя пользователя и пароль

public Authentication signin(String username, String password) throws Exception{
        Authentication auth = new UsernamePasswordAuthenticationToken("pan@abc.in", "password");
        return authenticationManager.authenticate(auth); // this line gives Bad Credential error
    }

Я получаю следующую ошибку при вызове метода authenticationManager.authenticate (auth)

ctiveDirectoryLdapAuthenticationProvider : Active Directory authentication failed: Supplied password was invalid
org.springframework.security.authentication.BadCredentialsException: Bad credentials
    at org.springframework.security.ldap.authentication.ad.ActiveDirectoryLdapAuthenticationProvider.badCredentials(ActiveDirectoryLdapAuthenticationProvider.java:308)

Причина: org.springframework.security.ldap.authentication.ad.ActiveDirectoryAuthenticationException: [LDAP: код ошибки 49 -80090308: LdapErr: DSID-0C09042F, комментарий: ошибка AcceptSecurityContext, данные 52e, v2580

Я прошел по следующим ссылкам: javax.naming.AuthenticationException: [LDAP: код ошибки 49 - неверные учетные данные]

Аутентификация Active Directory с использованием Spring Security 3.2, Spring Ldap 2.0 и JavaConfig

LDAP: код ошибки 49 - 80090308: LdapErr: DSID-0C0903A9,комментарий: ошибка AcceptSecurityContext, данные 52e, v1db1

На основе приведенных выше ссылок я пробовал setAuthoritiesMappи я передал NullAuthoritiesMapper, поскольку у меня нет прав доступа к карте.

adProvider.setAuthoritiesMapper(new NullAuthoritiesMapper());

Я попытался внести изменения в userDNPattern = "CN=pan,OU=Users,OU=UCV,DC=org,DC=abc,DC=in";, но это не сработало.CN = pan - мое имя пользователя

Я могу получить доступ к Apache Active Directory с указанным выше URL, доменом и userDnPattern и паролем.Нужно ли кодировать пароль?

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Ваш домен "org.abc.in".измените "pan@abc.in" на "pan", ActiveDirectoryLdapAuthenticationProvider автоматически добавит в него ваш домен, как вы уже указали при его создании ("org.abc.in").

0 голосов
/ 20 декабря 2018

Возможно, это не единственная проблема, но она, безусловно, является ее частью:

adProvider.setSearchFilter(userDNPattern);

Этот метод принимает запрос LDAP для поиска пользователя, а не DN.Документация для setSearchFilter() гласит, что по умолчанию используется следующее:

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

Это займет имя пользователя, которое вы ему дадите, и найдет пользователя с таким userPrincipalName ("username @"domain.com "format).

Если это то, что вы хотите, то вам вообще не нужно звонить setSearchFilter().

Если вы хотите, чтобы пользователи могли входить, используя толькоимя пользователя (sAMAccountName), тогда вы можете использовать это:

adProvider.setSearchFilter("(&(objectClass=user)(sAMAccountName={0}))");

Обновление: Я думаю, у вас есть пара других проблем:

private String url = "ldaps://org.abc.in:3387";
private String domain = "org.abc.in";

Во-первых, ldaps:// на самом деле не действителен.Просто используйте ldap://.Если указанный порт использует SSL, он будет выполнять рукопожатие SSL.

Кроме того, вы устанавливаете домен на org.abc.in, но при входе в систему вы используете @abc.in.Указанный вами domain добавляется к имени пользователя, которое вы указываете для входа в систему, поэтому он пытается войти в систему с помощью pan@abc.in@org.abc.in, что, конечно, не будет работать.Вам лучше установить domain на null, чтобы он не пытался добавить что-либо позже.Но это означает, что ваши пользователи должны будут войти в систему в формате username@abc.in.

...