在Java Web Project中,我试图让用户更改自己的LDAP密码(因为它已过期或因为他们只是想要)。这些用户没有管理权限。
我已经能够搜索找到其中一个用户,但我无法更改密码。 有没有办法让用户更改自己的LDAP密码而不给他们管理权限?
以下是我现在的代码:
DirContext context;
context = getInitialContext(username, password, ldapPath, ldapDomain);
// Set up search constraints
SearchControls cons = new SearchControls();
String[] attrIDs = { "cn" };
cons.setReturningAttributes(attrIDs);
cons.setSearchScope(SearchControls.ONELEVEL_SCOPE);
String USERS_OU = ldapPath.split("/")[ldapPath.split("/").length-1];
NamingEnumeration<?> results = context.search(USERS_OU, "sAMAccountName=[name]", cons); //I'm searching the sAMA for testing purposes
while (results.hasMore()) {
SearchResult result = (SearchResult) results.next();
Attributes attrs = result.getAttributes();
String userCN = attrs.get("cn").get(0).toString();
// Here I'm able to retrieve a user's CN
ModificationItem[] mods = new ModificationItem[2];
Attribute mod0 = new BasicAttribute("userPassword", password);
Attribute mod1 = new BasicAttribute("userPassword", newPass);
mods[0] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, mod0);
mods[1] = new ModificationItem(DirContext.ADD_ATTRIBUTE, mod1);
context.modifyAttributes([CN + ldapPath], mods );
}
提前致谢!
更新:我已经检查了rkosegi标记的问题,但我认为该解决方案并不适用于此,因为OP正在尝试更改为&#39; unicodePwd&#39;而不是&#39; ; userPassword&#39;和&#39; unicodePwd&#39;要求连接是ldaps。
我在研究中发现了一件事,而且在.NET上有一个特殊的操作,即DirectoryEntry.Invoke方法,它是其中一种可能的方法。操作&#39; ChangePassword&#39;,它不需要管理员权限。也许在Java上有类似的东西?
答案 0 :(得分:0)
经过深思熟虑的研究后,我得出的结论是,基于LDAP服务器的默认配置,codebrane的答案是正确的。
我发现有一条指令阻止用户更改自己的密码,即使它已过期。 (This document解释了如何确定它是否已启用)
因此,解决方案是更改指令以允许用户更改自己的密码,或使用特权凭据进行此类更改。
谢谢!
答案 1 :(得分:-1)
您通常以特权用户身份绑定,并使用该用户更改其他用户的密码。您可以找到没有特殊权限的用户,这很可能是因为它允许匿名绑定和搜索。需要使用特权帐户更改用户密码。