Spring LDAP-аутентификация неверный пароль в типе Salted SHA

У меня есть проект для аутентификации LDAP с сервисом REST. В моей конфигурации LDAP есть метод хеширования паролей Salta SHA (SSHA). В руководстве по проверке подлинности LDAP Spring, поддерживающем метод SHA, когда я использовал, я получил неверные учетные данные, в то время как учетные данные в порядке.

Моя ссылка на класс конфигурации:

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .ldapAuthentication()
                .userSearchFilter("uid={0}")
                .contextSource(contextSource())
                .passwordCompare()
                    .passwordEncoder(new LdapShaPasswordEncoder())
                    .passwordAttribute("userPassword");
    }

    @Bean
    public DefaultSpringSecurityContextSource contextSource() {
        return new DefaultSpringSecurityContextSource(Arrays.asList("ldap://localhost:8389/"), "dc=springframework,dc=org");
    }
}

Моя конфигурация ldif;

dn: uid=ben,ou=people,dc=springframework,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Ben Alex
sn: Alex
uid: ben
userPassword: {SSHA}pcFdFhO/NS98EhTRup60PMkHMWFRDkJ3jUu1Zg==

Мой оригинальный пароль Test1234, мой pom.xml файл;

   <dependency>
       <groupId>org.springframework.ldap</groupId>
       <artifactId>spring-ldap-core</artifactId>
   </dependency>
   <dependency>
       <groupId>org.springframework.security</groupId>
       <artifactId>spring-security-ldap</artifactId>
   </dependency>
   <dependency>
       <groupId>com.unboundid</groupId>
       <artifactId>unboundid-ldapsdk</artifactId>
   </dependency>

Как я могу пройти аутентификацию с моим именем пользователя / паролем на сервере ldap с шифрованием пароля SSHA?

2 ответа

Попробуйте этот подход

auth
        .ldapAuthentication()
            .userSearchFilter("uid={0}")
            .contextSource(contextSource())
            .passwordCompare().passwordAttribute("userPassword")
            .and()
            .passwordEncoder(passwordEncoder());

И создайте собственный кодер пароля

private PasswordEncoder passwordEncoder() {
    final LdapShaPasswordEncoder sha = new LdapShaPasswordEncoder();
    return new PasswordEncoder() {
        @Override
        public String encode(CharSequence rawPassword) {
            return sha.encodePassword(rawPassword.toString(), null);
        }
        @Override
        public boolean matches(CharSequence rawPassword, String encodedPassword) {
            return sha.isPasswordValid(encodedPassword, rawPassword.toString(), null);
        }
    };
}

У меня была такая же проблема, и она работала для меня.

Надеюсь, это поможет вам!

Я столкнулся с подобной проблемой, используя bcrypt, поддерживаемый каталогом Apache. Я решил это благодаря решению, предложенному @jrdalpra. Вот мое решение для тех, кто находится в такой же ситуации:

private PasswordEncoder newPasswordEncoder() {
  final BCryptPasswordEncoder crypt = new BCryptPasswordEncoder();
  return new PasswordEncoder() {
    @Override
    public String encode(CharSequence rawPassword) {
      // Prefix so that apache directory understands that bcrypt has been used.
      // Without this, it assumes SSHA and fails during authentication.
      return "{CRYPT}" + crypt.encode(rawPassword);
    }
    @Override
    public boolean matches(CharSequence rawPassword, String encodedPassword) {
      // remove {CRYPT} prefix
      return crypt.matches(rawPassword, encodedPassword.substring(7));
    }
};

}

Придерживайтесь своего исходного кода, но на этот раз попробуйте сделать .userSearchFilter("uid={0}") в .userSearchFilter("uid={0},ou=people") или же .userDnPatterns("uid={0},ou=people"),

Другие вопросы по тегам