Изменить пароль без учетной записи администратора JNDI LDAP AD, когда истек срок действия пароля - PullRequest
0 голосов
/ 28 апреля 2020

У меня следующая проблема. Я попытался изменить пароли от пользователей AD с учетной записью администратора через JNDI успешно. Проблема в том, что теперь у меня нет этого доступа администратора.

Единственное, что я хочу использовать, это функция смены пароля, это изменение пароля пользователя после его истечения.

Можно ли изменить пароль пользователя с его собственными учетными данными (имя пользователя и старый пароль), даже если срок их действия истек с использованием JNDI? И если это возможно, что мне делать в моем коде?

Это мой текущий код

public String changePassword(String username, String password, String newPassword)
{
    Hashtable env = new Hashtable();
    String domain = (String) context.getBean("domain");

    String base = (String) context.getBean("base");

    env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.ldap.LdapCtxFactory");


    env.put(Context.SECURITY_AUTHENTICATION, "simple");

    env.put(Context.SECURITY_PRINCIPAL, username + domain);


    env.put(Context.SECURITY_CREDENTIALS, password );

    env.put(Context.PROVIDER_URL,context.getBean("url"));


    env.put(Context.SECURITY_PROTOCOL, "ssl");

    try {
        // Create the initial directory context
        LdapContext ctx = new InitialLdapContext(env,null);


        ModificationItem[] mods = new ModificationItem[2];


        String oldQuotedPassword = "\"" + password + "\"";
        byte[] oldUnicodePassword = oldQuotedPassword.getBytes("UTF-16LE");
        String newQuotedPassword = "\"" + newPassword + "\"";
        byte[] newUnicodePassword = newQuotedPassword.getBytes("UTF-16LE");


        mods[0] = new ModificationItem(DirContext.REMOVE_ATTRIBUTE, new BasicAttribute("unicodePwd", oldUnicodePassword));
        mods[1] = new ModificationItem(DirContext.ADD_ATTRIBUTE, new BasicAttribute("unicodePwd", newUnicodePassword));


        ctx.modifyAttributes("cn=" + username + ',' + base, mods);

        ctx.close();

        return "Changed Password for: " + username;
    }
    catch (NamingException e) {
        return new String ("Problem changing password: " + e);
    }
    catch (UnsupportedEncodingException e) {
        return new String("Problem encoding password: " + e);
    }

}

Если нет, я мог бы также использовать Spring LDAP. Там это могло быть возможно? Как? Спасибо заранее и извините, если я не очень хорошо объяснил себя, это мой первый пост здесь

...