使用LDAP的Java:更改没有管理权限的用户密码?

时间:2017-11-06 13:12:14

标签: java ldap

在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上有类似的东西?

2 个答案:

答案 0 :(得分:0)

经过深思熟虑的研究后,我得出的结论是,基于LDAP服务器的默认配置,codebrane的答案是正确的。

我发现有一条指令阻止用户更改自己的密码,即使它已过期。 (This document解释了如何确定它是否已启用)

因此,解决方案是更改指令以允许用户更改自己的密码,或使用特权凭据进行此类更改。

谢谢!

答案 1 :(得分:-1)

您通常以特权用户身份绑定,并使用该用户更改其他用户的密码。您可以找到没有特殊权限的用户,这很可能是因为它允许匿名绑定和搜索。需要使用特权帐户更改用户密码。