2016-08-23 27 views
1

現在、管理者DNを使用してユーザーのパスワードをリセットできるカスタムパスワードリセットツールを使用していますが、ビジネスユースケースを完全に処理するために、一部の操作属性を削除/変更する必要もあります。Java/JNDIからOpenLDAPの操作属性を変更するにはどうすればよいですか?

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; 

しかし、ときに私はこれを実行する...

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のようなものを行うには、いくつかの操作属性を変更する必要があります:私は使用してLDAPサーバーに接続します、私は得る:

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

誰かが私をなぜ理解するのに役立つだろうか?

+0

'modifyTimtestamp'属性は、ユーザーが変更できません。奇妙なことに、パスワードやその他のものを更新してもこの属性は更新されないようです。他の属性を変更するだけで、これを達成することができます。 –

答えて

1

Java/JNDIからOpenLDAPの操作属性を変更する方法を教えてください。

あなたはありません。サーバーが行います。それが「操作属性」の意味です。

また、私は完全に

不運を業務ユースケースを処理するためにいくつかの操作属性を変更/削除する必要があります。

あなたはこれをすべてロールするのではなく、「ppolicy」オーバーレイと関連する拡張パスワード変更操作を使用する必要があります。それはあなたが必要とするすべてを行いますが、あなたのニーズを調整する必要がなければ;-)

NB自分でパスワードをハッシュしないでください。 OpenLDAPは正しく設定されたときにそれを行います。

+0

ppolicyは定位置にあり、通常のユーザーがパスワードを更新するときに効果的です。問題は、これが管理者DNとして認証されることを意味するパスワードリセットツールであり、ppolicyは管理DNが何もしないようにしないということです。 –

+1

いいえ、問題は、(a)上記のコードで拡張パスワード変更操作を使用していないことです。つまり、このコードでppolicyオーバーレイを完全にバイパスしています。(b)内部マネージャー任意のDN:適切な権限を持つ管理ユーザーを定義して使用する必要があります。マネージャDNは、OoenLDAP自体用です。どの人やアプリケーションでも使用するべきではありません。 – EJP

+0

さらに説明したりリンクを提供したりできますか? –

関連する問題