在389 ds下,我们已将其设置为密码策略,以保存历史记录中的最后5个密码,因此无法使用这些密码。
我们有java应用程序,在其中更改了密码为LDAP管理员。但是,当更改密码而不是在密码历史记录中添加新密码时,它将用新密码替换旧密码。这使用户可以将密码更改为过去使用的密码。
例如。
- 用户将密码设置为ABC,然后历史记录为{ABC}。
- 用户将密码更改为EFG,然后历史记录为{ABC,EFG}
- 管理员将密码更改为XYZ,然后将历史记录为{xyz,abc,efg},但它是{xyz,efg}。
private static void changePasswordAsAdmin(String userDn, String sNewPassword) throws Exception {
System.out.println("Setting Password:" + sNewPassword);
LDAPConnection connection = new LDAPConnection(new MySSLSocketFactory(), "Ldap host", 636, "adminCN", "adminPwd" );
final List mods = new ArrayList();
final Modification item = new Modification(ModificationType.REPLACE, "userPassword", sNewPassword);
mods.add(item);
final ModifyRequest request = new ModifyRequest(userDn, mods);
try {
LDAPResult result = connection.modify(request);
System.out.println(result.getResultString());
}
catch(Exception e) {
System.out.println(e.getMessage());
throw e;
}
}
private static void changePasswordAsUser(String userDn, String oldPassword, String newPassword) throws Exception {
System.out.println("Setting Password, old password: " + oldPassword + ", new password: " + newPassword);
LDAPConnection connection = new LDAPConnection(new MySSLSocketFactory(), "ldapHost", 636, "userDn", "oldPassword");
final List mods = new ArrayList();
final Modification item = new Modification(ModificationType.REPLACE, "userPassword", newPassword);
mods.add(item);
final ModifyRequest request = new ModifyRequest(userDn, mods);
try {
LDAPResult result = connection.modify(request);
System.out.println(result.getResultString());
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
这是一个已知的错误,应根据以下方式修复:https://pagure.io/389-ds-base/issue/48813
尝试更新389ds的版本