我目前正在开发带有Spring Boot的应用程序。从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管理工具中使用了“创建新用户”向导的默认值)-例如:是否必须向用户提供一些特殊权限?
一些帮助会非常好。
答案 0 :(得分:0)
更改unicodePassword时,AD需要加密的连接LDAPS。 如果尚未在AD上设置LDAPS,则以下URL可能会对您有所帮助。