如何从Java/JNDI修改OpenLDAP中的操作属性?

如何从Java/JNDI修改OpenLDAP中的操作属性?,java,ldap,jndi,openldap,Java,Ldap,Jndi,Openldap,我们正在开发一个自定义密码重置工具,该工具目前能够为用户重置密码(使用admin DN),但我还需要删除/修改一些操作属性,以便完全处理业务用例。我使用以下方式连接到LDAP服务器: private void connect() throws NamingException { Properties props = new Properties(); props.put(INITIAL_CONTEXT_FACTORY, LDAP_CTX_FACTORY); props.p

我们正在开发一个自定义密码重置工具,该工具目前能够为用户重置密码(使用admin DN),但我还需要删除/修改一些操作属性,以便完全处理业务用例。我使用以下方式连接到LDAP服务器:

private void connect() throws NamingException {
    Properties props = new Properties();
    props.put(INITIAL_CONTEXT_FACTORY, LDAP_CTX_FACTORY);
    props.put(PROVIDER_URL, format("ldap://%s:%d/", config.ldapHost(), config.ldapPort()));
    props.put(SECURITY_CREDENTIALS, config.ldapBindPassword());
    props.put(SECURITY_PRINCIPAL, config.ldapBindUser());
    props.put(SECURITY_AUTHENTICATION, "simple");
    props.put(REFERRAL, "follow");
    props.put(BATCHSIZE, "1000");
    connection = new InitialLdapContext(props, null);
    connection.setRequestControls(LDAPControls.controls());

    LOG.debug("Successfully completed bind to LDAP server '{}'", config.ldapHost());
    connected = true;
}
我需要修改一些操作属性来执行解锁帐户/更新修改时间等操作

    List<BasicAttribute> attrs = new ArrayList<>();
    List<ModificationItem> mods = new ArrayList<>();
    // Set password hash
    attrs.add(new BasicAttribute("userPassword", "{SSHA}" + hashPassword(salt, password)));
    mods.add(new ModificationItem(REPLACE_ATTRIBUTE, attrs.get(0)));
    // Set last modified timestamp
    attrs.add(new BasicAttribute("modifyTimestamp", date.withZone(UTC).format(now())));
    mods.add(new ModificationItem(REPLACE_ATTRIBUTE, attrs.get(1)));
    // Set password changed time
    attrs.add(new BasicAttribute("pwdChangeTime", date.withZone(UTC).format(now())));
    mods.add(new ModificationItem(REPLACE_ATTRIBUTE, attrs.get(2)));
    // Remove password lock
    attrs.add(new BasicAttribute("pwdAccountLockedTime"));
    mods.add(new ModificationItem(REMOVE_ATTRIBUTE, attrs.get(3)));
    // Clear password failure time
    attrs.add(new BasicAttribute("pwdFailureTime"));
    mods.add(new ModificationItem(REMOVE_ATTRIBUTE, attrs.get(4)));
    this.reconnect();
    ModificationItem[] modItems = new ModificationItem[mods.size()];
    mods.toArray(modItems);
    connection.modifyAttributes(getDN(email), modItems);
    LOG.debug("Completed update of user password for '{}'", email);
    return true;
谁能帮我找出原因吗

如何从Java/JNDI修改OpenLDAP中的操作属性

你没有。服务器可以。这就是“操作属性”的含义

我还需要删除/修改一些操作属性,以便完全处理业务用例

运气不好

您应该使用“ppolicy”覆盖和相关的扩展密码修改操作,而不是自己滚动所有这些操作。它可以满足您的所有需求,如果不满足,您需要调整您的需求;-)


注意:您不应该自己散列密码。正确配置后,OpenLDAP将为您执行此操作。

用户无法修改
modifyimtestamp
属性。奇怪的是,更新密码之类的东西似乎并没有更新这个属性。也许只有修改其他属性才能实现这一点。当普通用户更新他们的密码时,政策已经到位,效果非常好。问题是,这是一个密码重置工具,意味着它作为管理员DN进行身份验证,并且ppolicy不会阻止管理员DN执行任何操作。不,问题是(a)您没有在上面的代码中使用扩展密码修改操作,这意味着您完全绕过了使用此代码的ppolicy覆盖,以及(b)您不应该将内部管理器DN用于任何用途:您应该定义一个具有适当权限的管理用户并使用该用户。管理器DN用于OoenLDAP本身。任何人或应用程序都不应该使用它。您能进一步解释或提供链接吗?具体请参见第一段:“拦截、解码和应用特定的密码策略控制”。太棒了!谢谢你的链接和澄清!
LDAP: error code 21 - modifyTimestamp: value #0 invalid per syntax