2016-08-23 45 views
1

我们正在开发一个自定义密码重置工具,它目前能够为用户重置密码(使用管理员DN),但我还需要删除/修改某些操作属性才能完全处理业务用例。我连接到LDAP服务器使用:如何从Java/JNDI修改OpenLDAP中的操作属性?

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; 
} 

,我需要修改一些操作属性做的事情像解锁账户/更新修改时间的/ etc ...

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; 

但是当我运行这个,我得到:

LDAP: error code 21 - modifyTimestamp: value #0 invalid per syntax 

谁能帮我弄清楚为什么?

+0

'modifyTimtestamp'属性不可由用户修改。奇怪的是,更新密码或者什么都不会更新这个属性。也许只有修改其他属性才能实现这一点。 –

回答

1

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

你不知道。服务器呢。这就是“操作属性”的意思。

我还需要删除/修改某些操作属性,以完整地处理业务用例

运气不好。

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

注意您不应该自己哈希密码。如果配置正确,OpenLDAP将为您做到这一点。

+0

ppolicy IS就位并且在普通用户更新密码时效果很好。问题是这是一个密码重置工具,它意味着它作为管理员DN进行身份验证,并且ppolicy不会阻止管理员DN执行任何操作。 –

+1

不,问题是(a)您没有在上面的代码中使用扩展密码修改操作,这意味着您完全绕过了使用此代码的ppolicy覆盖层,并且(b)您不应该使用内部管理器DN适用于任何情况:您应该定义具有适当权限的管理用户并使用它。经理DN是OoenLDAP本身。它不应该被任何人或应用程序使用。 – EJP

+0

您能否进一步解释或提供链接? –