Spring Security 5.1.5 + Payara Server + ApacheDS LDAP проблема аутентификации - PullRequest
0 голосов
/ 09 апреля 2019

Добрый день, ребята. Как видно из заголовка, у меня возникают проблемы с аутентификацией пользователей на основе 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. Из того, что я могу сказать, это так:

  1. Получить имя пользователя и пароль со страницы входа в систему
  2. Поиск пользователя по его DN
  3. Получить хешированный пароль пользователя
  4. Кодируйте пароль, полученный через форму входа, используя алгоритм хеширования с идентификатором, который соответствует идентификатору пароль хранится на сервере LDAP
  5. Сравните кодированный пароль с паролем, извлеченным из LDAP. сервер. Если они одинаковы, аутентификация проходит успешно. Если не, терпеть неудачу

Заранее большое спасибо за любые ответы. Как видите, я впервые работаю с серверами Spring Security и LDAP.

...