LDAP + Spring: как авторизоваться правильно?

97
21 августа 2021, 13:10

В Spring есть реализация авторизация по LDAP. В нашем конкретном случае, это происходит через ActiveDirectoryLdapAuthenticationProvider.

Выглядит это так:

private Authentication authenticate(String username, String password, HelpDescUser userDetails) {
    String url = "ldap://" + ldapHost + ":" + port + "/";
    ActiveDirectoryLdapAuthenticationProvider ldapProvider =
            new ActiveDirectoryLdapAuthenticationProvider(domain, url, rootDn);
    String filterWithName = String.format(filter, username);
    ldapProvider.setSearchFilter(filterWithName);
    ldapProvider.setContextEnvironmentProperties(createProperties(username, password));
    ldapProvider.setConvertSubErrorCodesToExceptions(true);
    UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, password);
    Authentication authenticate;
    try {
        authenticate = ldapProvider.authenticate(authentication);
    } catch (Exception e) {
        throw new BadCredentialsException("Пользователь не авторизован (сервер LDAP не подтвердил авторизацию).");
    }
    if (Objects.nonNull(authenticate) && authenticate.isAuthenticated()) {
        return new UsernamePasswordAuthenticationToken(userDetails, password, userDetails.getAuthorities());
    } else {
        throw new BadCredentialsException("Пользователь не авторизован (сервер LDAP не подтвердил авторизацию).");
    }
}
private Map<String, Object> createProperties(String username, String password) {
    Map<String, Object> properties = new HashMap<>();
    properties.put(Context.SECURITY_PRINCIPAL, username);
    properties.put(Context.SECURITY_CREDENTIALS, password);
    return properties;
}

Есть проблема.

Как я понимаю схему авторизации, если мы хотим авторизоваться под каким-нибудь юзером, нам необходимо иметь также технический аккаунт. Мы биндимся под техническим аккаунтом, потом забрасываем на авторизацию логин и пароль юзера и получаем ответ - авторизован он или нет. Но в данной схеме биндинг происходит под тем же юзером, что и пытается авторизоваться, что неправильно.

Подскажите, есть ли готовое решение по авторизации через биндинг технического аккаунта через Spring ActiveDirectoryLdapAuthenticationProvider?

READ ALSO
Как переконфигурить OAuth2Config

Как переконфигурить OAuth2Config

Есть конфигурация

172
Не получается использовать table

Не получается использовать table

Есть база данных sql, в ней есть две таблицы, при вводе команды use user, выводится фраза Database changedОднако при выполнении такой же последовательности...

97
Не могу обрезать переменную ошибка?

Не могу обрезать переменную ошибка?

Нужно чтобы переменная value приняла форматированное значение переменной Toast_otv

231
Перевод с Gradle на Maven

Перевод с Gradle на Maven

Передо мной оказалась такая задача: перевести работающий проект с gradle на maven (ну так уж захотелось заказчику)У меня с этим возникли определенные...

174