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")
,