В 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?
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости