【发布时间】:2012-03-14 10:15:41
【问题描述】:
我没有(也不会)拥有管理员帐户。 我想从 java 更改 Active Directory 中的自己(用户)密码。 我该怎么做?
使用来自网络的代码:
private void changePass() throws Exception {
String oldpass = this.encodePassword("oldpass!");
String newpass = this.encodePassword("newpass!");
Attribute oldattr = new BasicAttribute("unicodePwd", oldpass);
Attribute newattr = new BasicAttribute("unicodePwd", newpass);
ModificationItem olditem = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, oldattr);
ModificationItem newitem = new ModificationItem(DirContext.ADD_ATTRIBUTE, newattr);
ModificationItem repitem = new ModificationItem(DirContext.REPLACE_ATTRIBUTE, newattr);
ModificationItem[] mods = new ModificationItem[2];
mods[0] = olditem;
mods[1] = newitem;
// ldapTemplate.modifyAttributes("cn=administrator,cn=Users", mods);
ldapTemplate.modifyAttributes("cn=smith,cn=Users", new ModificationItem[] { repitem });
}
这里是上下文来源
<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
<property name="url" value="ldap://ldapserver:389"/>
<property name="base" value="dc=company,dc=com"/>
<property name="userDn" value="smith@company"/>
<property name="password" value="oldpass"/>
</bean>
我明白了:
LDAP: error code 32 - 0000208D: NameErr: DSID-0310020A, problem 2001 (NO_OBJECT), data 0, best match of:
'CN=Users,DC=company,DC=com'
如果我将 userDn 更改为“cn=smith”,我得到:
LdapErr:DSID-0C0903A9,注释:AcceptSecurityContext 错误
也许我的问题是我不明白 LDAP 是如何工作的?是否可以(使用用户帐户更改用户密码)? 而且,如果可能的话,我可以使用相同的权限检查帐户锁定/过期吗?
更新/解决
非常感谢您的帮助。这对我也很有帮助。
对于未来的搜索者:
NO_OBJECT - 表示 Active Directory 找不到对象(my cn=Users,cn=Smith) 要找到用户目录的完全限定规范路径,您可以使用用户属性“distinguishedName”(在我的最坏情况下,它是“cn=John\, Smith”,ou=Contractors,ou=用户帐户,ou=Accounts")
然后我得到了:
WILL_NOT_PERFORM - 这可能意味着不同类型的事情。在我的情况下,对象类型有误,但可能还有其他情况,如下所述 - 不是 SSL 连接 (not ldaps://) 等等。
然后:
INSUFF_ACCESS_RIGHTS - 用户(不是管理员没有权限替换密码属性),要更改密码,他必须输入旧密码和新密码,然后删除旧密码并添加新密码。
Attribute oldattr = new BasicAttribute("unicodePwd", oldQuotedPassword.getBytes("UTF-16LE"));
Attribute newattr = new BasicAttribute("unicodePwd", newQuotedPassword.getBytes("UTF-16LE"));
ModificationItem olditem = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, oldattr);
ModificationItem newitem = new ModificationItem(DirContext.ADD_ATTRIBUTE, newattr);
ldapTemplate.modifyAttributes("cn=John\\, Smith,ou=Contractors,ou=User Accounts,ou=Accounts", new ModificationItem[] { olditem, newitem });
问题 1005 (CONSTRAINT_ATT_TYPE) - 如果旧密码错误
顺便说一句
javax.naming.PartialResultException:未处理的继续引用; remaining name '/' - 在全局搜索个人/用户时(例如,在身份验证方法中) ldapTemplate.setIgnorePartialResultException(true);可以解决的
【问题讨论】:
标签: java active-directory ldap spring-ldap