В настоящее время я разрабатываю приложение с весенней загрузкой. Пользователь для этого приложения читаются из MS Active Directory. Хотя чтение всех пользователей из AD и проверка подлинности через Spring Boot Security Configuration работают нормально, у меня возникли некоторые проблемы при изменении пароля пользователя.
Я не хочу, чтобы пользователи моего приложения входили в мой контроллер домена, чтобы изменить свои начальные пароли. Так что это должно быть возможно через само приложение.
В настоящее время я пытался использовать приведенный ниже код, но я получаю исключение при попытке:
Произошла непредвиденная ошибка (тип = Внутренняя ошибка сервера, статус = 500).
[LDAP: код ошибки 50 - 00002098: SecErr: DSID-03150F93, проблема 4003 (INSUFF_ACCESS_RIGHTS), данные 0]; вложенным исключением является javax.naming.NoPermissionException: [LDAP: код ошибки 50 - 00002098: SecErr: DSID-03150F93, проблема 4003 (INSUFF_ACCESS_RIGHTS), данные 0]; оставшееся имя 'cn = тестирующий пользователь'
public void changeUserPassword(String username, String oldPassword, String newPassword) {
byte[] encodedNewPassword = encode(newPassword);
ModificationItem[] mods = new ModificationItem[1];
mods[0] = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, new BasicAttribute("UnicodePwd", encodedNewPassword));
String base = "OU=someOtherOU,OU=someOu,DC=domain,DC=dom";
String userCN = "CN="+username;
String userDN = userCN + "," + base;
LdapContextSource contextSource = new LdapContextSource();
contextSource.setUrl("ldap://my-domain.com:389");
contextSource.setBase(base);
contextSource.setUserDn(userDN);
contextSource.setPassword(oldPassword);
contextSource.afterPropertiesSet();
LdapTemplate ldapTemplate = new LdapTemplate(contextSource);
ldapTemplate.modifyAttributes(UserCN, mods);
}
private byte[] encode(String password) {
String quotedPassword = "\"" + password + "\"";
char[] unicodePassword = quotedPassword.toCharArray();
byte[] passwordArray = new byte[unicodePassword.length * 2];
for (int i = 0; i < unicodePassword.length; i++) {
passwordArray[i * 2 + 1] = (byte) (unicodePassword[i] >>> 8);
passwordArray[i * 2] = (byte) (unicodePassword[i] & 0xff);
}
return passwordArray;
}
Этот код приведет к ошибке, которую я уже опубликовал. Поскольку у меня мало опыта использования протоколла ldap и активного каталога, я не знаю, что я делаю здесь неправильно.
Есть ли ошибка в моем коде?
Или это указывает на некоторую неправильную конфигурацию в активном каталоге? (Я использовал значения по умолчанию для мастера создания нового пользователя в средстве управления Active Directory) - например: Должен ли я предоставить некоторые специальные разрешения пользователю?
Некоторая помощь была бы очень хороша.