【发布时间】:2021-11-23 22:42:56
【问题描述】:
我创建了一个端点来更新我们 Active Directory 中用户的密码 使用 LDAP 弹簧。 在不检查之前的密码是否匹配的情况下更改它没有问题,但我需要以某种方式检查之前的密码是否与当前在活动目录中的密码相同。
我的代码现在给我这个错误:
LDAP: error code 19 - 0000216C: AtrErr: DSID-03190F1E,
#1:\n\t0: 0000216C: DSID-03190F1E, problem 1005 (CONSTRAINT_ATT_TYPE), data 0, Att 9005a (unicodePwd)
我的密码更新代码如下:
public void updateUserPassword(User user,String oldPassword, String newPassword) throws NameNotFoundException, UnsupportedEncodingException {
Attribute oldattr = new BasicAttribute("unicodePwd", toUnicodeBytes(oldPassword);
Attribute newattr = new BasicAttribute("unicodePwd", toUnicodeBytes(newPassword);
ModificationItem olditem = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, oldattr);
ModificationItem newitem = new ModificationItem(DirContext.ADD_ATTRIBUTE, newattr);
ldapTemplate.modifyAttributes(buildDn(user), new ModificationItem[] { olditem, newitem });
}
public static byte[] toUnicodeBytes(String password){
String quotedPassword = "\"" + password + "\"";
char unicodePwd[] = quotedPassword.toCharArray();
byte pwdArray[] = new byte[unicodePwd.length * 2];
for (int i = 0; i < unicodePwd.length; i++)
{
pwdArray[i * 2 + 1] = (byte) (unicodePwd[i] >>> 8);
pwdArray[i * 2 + 0] = (byte) (unicodePwd[i] & 0xff);
}
return pwdArray;
}
下面的代码有效,但是我想验证之前的密码是否正确,所以不能使用。
public void updateUserPassword(User user,String oldPassword, String newPassword) throws NameNotFoundException, UnsupportedEncodingException {
Attribute attr = new BasicAttribute("unicodePwd",toUnicodeBytes(newPassword));
ModificationItem item = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, attr);
ldapTemplate.modifyAttributes(buildDn(user), new ModificationItem[] { item });
}
关于如何解决问题的任何想法?提前致谢。
【问题讨论】:
-
与您测试的用户是否真的有权更改自己的密码?
-
是的,是管理员用户。
标签: java spring active-directory ldap