【发布时间】:2019-04-26 07:31:17
【问题描述】:
我目前正在开发一个带有 spring boot 的应用程序。此应用程序的用户是从 MS Active Directory 中读取的。虽然从 AD 读取所有用户并通过 Spring Boot 安全配置进行身份验证工作正常,但我在更改用户密码时遇到了一些麻烦。
我不希望我的应用程序的用户登录到我的域控制器来更改他们的初始密码。所以这应该可以通过应用程序本身来实现。 目前我尝试使用下面的代码,但在尝试时遇到异常:
出现意外错误(类型=内部服务器错误,状态=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=testing user'
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 管理工具中使用“创建新用户”向导的默认值) - 例如:我是否必须为用户提供一些特殊权限?
一些帮助会非常好。
【问题讨论】:
标签: spring-boot active-directory