Добрый день, ребята. Как видно из заголовка, у меня возникают проблемы с аутентификацией пользователей на основе ApacheDS, при использовании последней версии Spring Security с JavaEE в приложении, развернутом на сервере Payara.
Я установил DIT в ApacheDS, с парой пользователей с паролями, хэшированными с помощью SHA256. Я знаю, что использую не очень безопасный алгоритм хеширования, но у меня возникают проблемы при попытке сопоставить алгоритмы хеширования, предоставляемые ApacheDS, с алгоритмами, доступными в Spring Security.
Что касается основной проблемы, я получаю исключение при аутентификации пользователя, которое java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "SHA256"
.
Я собираюсь перечислить соответствующие фрагменты кода, которые должны сделать процесс аутентификации этого приложения:
pom.xml
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-bom</artifactId>
<version>5.1.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ldap</groupId>
<artifactId>spring-ldap-core</artifactId>
<version>2.3.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-ldap</artifactId>
</dependency>
</dependencies>
Класс WebSecurityConfig
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest()
.fullyAuthenticated()
.and()
.formLogin();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.
ldapAuthentication()
.userDnPatterns("uid={0},ou=users,ou=applications")
.contextSource()
.url("ldap://localhost:10389/dc=mycompany,dc=com")
.and()
.passwordCompare()
.passwordEncoder(PasswordEncoderFactories.createDelegatingPasswordEncoder())
.passwordAttribute("userPassword");
}
}
SecurityWebApplicationInitializer class
public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {
public SecurityWebApplicationInitializer() {
super(WebSecurityConfig.class);
}
}
Согласно тому, что я мог переварить из документации Spring Security, предыдущие два класса - это все, что мне нужно для включения и использования аутентификации с использованием Spring Security в веб-приложении JavaEE. Мое приложение представляет собой веб-приложение JSF, и я использую Payara Server версии 4.1.2.172 для его развертывания. Я также использую форму входа по умолчанию, созданную Spring Security, для входа в приложение, которое я планирую заменить, как только смогу решить эту проблему. Кстати, я не использую встроенный сервер ApacheDS - я использую не встроенную установку ApacheDS.
Обратите внимание, что это исключение отличается от тех, которые, как кажется, получают многие люди, в которых идентификатор равен "null". Также я могу утверждать, что приложение правильно обращается к ApacheDS, но по какой-то причине у него возникла проблема с поиском кодировщика пароля для хешированного пароля sha256, определенного пользователями. Я проверил, как ApacheDS хранит пароль, и он выглядит следующим образом: {SHA256} 14Kjt6P / yQAg3t7Vr7JRldj9hJ032OWJSp2MAaU843w =. Я могу ошибаться, но я думаю, что Spring Security ожидает, что идентификатор алгоритма хеширования будет в нижнем регистре, судя по коду, который я видел в Интернете, как от разработчиков Spring Security, как на этой странице, так и от кода от другие люди в интернете.
Пожалуйста, помогите мне обойти эту проблему, и, если возможно, кто-нибудь подскажет, какой самый безопасный алгоритм хеширования, предоставляемый ApacheDS, также поддерживается Spring Security?
Кроме того, я хотел бы знать, какой алгоритм использует Spring Security для аутентификации пользователя, когда задействован сервер LDAP. Из того, что я могу сказать, это так:
- Получить имя пользователя и пароль со страницы входа в систему
- Поиск пользователя по его DN
- Получить хешированный пароль пользователя
- Кодируйте пароль, полученный через форму входа, используя
алгоритм хеширования с идентификатором, который соответствует идентификатору
пароль хранится на сервере LDAP
- Сравните кодированный пароль с паролем, извлеченным из LDAP.
сервер. Если они одинаковы, аутентификация проходит успешно. Если не,
терпеть неудачу
Заранее большое спасибо за любые ответы. Как видите, я впервые работаю с серверами Spring Security и LDAP.